关于浮点数存储的问题
直接上代码了,测试环境是VC6.0
#include "stdafx.h"
#include "stdio.h"
#include "iostream.h"
int main(int argc, char* argv[])
{
float f = 3.14;
int i = *(int *)&f;
int j = 0,sign = 0;
for(j = 31;j>=0;j--,sign++)
{
printf("%2d:%d\r\n",sign,(i>>j)%2);
}
//getchar();
return 0;
}
输出结果前23位是:
0 10000000 0100100011110101
实际计算结果应该是:
0 10000010 00100011110101
把其中f的值改成120.5 算出来与运行结果相同。
不知道哪里出问题了。希望高手帮忙解答下。
[解决办法]
我自己在计算机上运行了你的程序,结果是0 10000000 1001 0001 1110 1011 1000 011。这个结果与我的预期相同。下面我把自己的计算过程列出来,希望对你有帮助。
3.14 转换为规格化2进制格式的步骤如下:
1)3.14化为二进制为11.0010 0011 1101 0111 0000 1010 .... 指数为0 符号位为0
2) 进行规格化后的结果为1.1001 0001 1110 1011 1000 0101 0 .... 指数为1 符号位为0
3) 按照单精度格式存储这个数。
首先计算尾数。
只有24个有效位,整数位的1省略。剩下为1001 0001 1110 1011 1000 010 10....
实际计算时发现10...之后有非0的bit,按照四舍五入需要向高位进1。尾数变为
1001 0001 1110 1011 1000 011
然后计算阶数。
1+127 = 128,即1000000。
符号位仍然为0。
因此,最终单精度格式的数为 0 1000000 1001 0001 1110 1011 1000 011。
4)你的程序运行时,从高位向低位输出。输出结果也是0 1000000 1001 0001 1110 1011 1000 011。