先看一例:
float a;
a=56.982;
1.浮点常量转换成机内二进制过程如下:
a.分别对整数和小数部分在运算器中转换成二进制形式
56.982 = 整数部分[0000 ... 0000 0011 1000].小数部分[1111 1011 0110 0100 0101 ...]
(存储整数部分和小部分的中间结果的寄存器不知是多少位,这里只算出整数部分中有用的后8位及小数部分中有用的前20位)
b.移位至成32位浮点数的标准格式(尾数占23位,首位1隐藏)
56.982 = 1 . 1100 0111 1101 1011 0010 001
(这里右移了5位)
c.计算出8位的阶码:5+127=1000 0100
d.符号位(占1位)为0
故56.982 机内二进制存储格式为:0100 0010 0110 0011 1110 1101 1001 0001
用下面程序可进行验证.
void main()
{
float a=56.982;
unsigned long *i=&a;
printf("%lx\n",*i);
}
运行结果:4263ed91
printf("%f",a);
2.输出按浮点数754标准存储格式存储0x4263ed91的浮点数
a.符号位0,正
b.计算指数=100 0010 0 - 0111 1111 =5
c.计算尾数=1.110 0011 1110 1101 1001 0001
ok问题出现了,
问题一:这里的二进制形式的尾数是通过乘法器?或是除法器?亦或加法器?转换成十进制形式的小数部分的?
计算原理是什么?
问题二:这里尾数的处理要放到寄存器里进行运算的吧,那么它的位数要和寄存器对齐,
那它后面空出的位是补1呢还是补0呢?个人觉得补1,这样可以进步缩小误差.
问题三:小数点后第一位权为0.5,后第二位权为0.25,后第三位权为0.125,...
如此,printf("%f",a);的结果应是: xx.xxx5 以5结尾的啊?
而由程序:
void main()
{
float a=56.982;
printf("%f",a);
}
的结果是:a=56.981998
我表示不理解,为什么结果不是以5结尾的.求解释
(第三个问题就是第一个问题.要知道问题一的原理,相信问题三就解决了)
|