浮点数转换程序设计

来源:百度知道 编辑:UC知道 时间:2024/05/26 18:40:00
主要任务:
浮点由阶码和尾数两部分组成,阶码为带符号的整数,尾数为小于 1 带符号的小数。计算过程中主要以足够长的尾数来保证数据的精度,以阶码来调整数模(绝对值)的大小(即改变小数符号处理。因此浮点数具有精度高、数的表达范围宽等特点,特别适用于计算过程复杂、精度要求高的场合。
根据菜单提示选择完成以下转换并显示转换结果:
键盘输入ASCII码的十进制浮点数(一位符号,若干位带小数点的尾数,一位指数符号,若干位十进制指数)转换为单精度二进制浮点数(24位二进制尾数,一位符号位,8位指数,偏置128),并显示在屏幕上。
;********************************************************
希望哪位高手能提供算法或建议。

最简单的算法是用一个字符指针指向输入的浮点数.
float f;
char *p = &f;
scanf("%f", &f);

好了, 我们知道float类型在内存中是4个字节, 低位在前
所以符号位就是
sign = (*(p + 3) & 0x80) >> 7 /* 屏蔽阶码并右移得到符号位 */
以后依次类推

指数
/* 取最高字节的低7位, 并次高字节的最高1位, 一共8位构成指数 */
exponent = ((*(p + 3) & 0x7F) << 1) | (*(p + 2) >> 7);

按2进制打印出来的话可以用以下方法
for (i = 0; i < 8; i++) {
unsigned char c;
c = exponent & temp? '1' : '0';
printf("%c", c);
temp = temp >> 1;
}
同理可以用来处理尾数, 要记住尾数只有23位, (23 (尾数) + 8(指数) + 1(符号位) = 32), 它们和隐含的小数点前面的1共同构成了24位的尾数.