CSDN博客

img mmpire

IEEE浮点数表示法

发表于2004/11/1 20:00:00  1509人阅读

题目:
(2004-11-01 16:32:40)   天堂雨(124059489)

main()
{
        float a,b;
        a=123456.789e5;
        b=a+20;
        printf("%f",b);
}
 


书上是这样解释的:

程序运行时,输出b的值与a相等。原因是:a的值比20大很多,a+20的理论值应是12345678920,而一个实型变量只能保证的有效数字是7位有效数字,后面的数字是无意义的,并不准确的表示该数。运行程序得到的a和b的值都是12345678848.000000,可以看到前8位是准确的,后几位是不准确的,把20加在后几位上,是无意义的。应当避免将一个很大的数和一个很小的数直接相加或相减,否则就会“丢失”小的数。与此类似,用程序计算1.0/3*3的结果并不等于1。

我的疑问是:12345678848.000000这个数字是怎么来的?

回答:
(2004-11-01 19:43:32)   mmpire(23433725)

IEEE浮点数表示法中,一个float数以32位存储,具体分配是:
31位:符号位
30-23位:指数位
22-0:数位
也就是说,只能有23位用来存数(实际可存24位二进制数,因为首位总是1可以略去),而12345678900转成二进制后有33位,如下:
10 1101 1111 1101 1100 0001 1100 0011 0100
只存取其前24位,计算的时候后面9位补上0,得:
10 1101 1111 1101 1100 0001 1100 0000 0000
用微软自带的计算器转一下,刚好是12345678848



32位float数的IEEE存储过程
*********************************************
12345678900
12345678920

10 1101 1111 1101 1100 0001 1100 0011 0100
1.01101 1111 1101 1100 0001 1100 0011 0100
10 1101 1111 1101 1100 0001 1100 0000 0000
33位
最高位1去掉
0 1101 1111 1101 1100 0001 1100 0011 0100
控制在23位
0 1101 1111 1101 1100 0001 11
0 1101 1111 1101 1100 0001 11
指数位加127
33+127=160
10100000

0 (1010 0000) 0110 1111 1110 1110 0000 111
01010000 00110111 11110111 00000111
50  37   F7    07
翻过来就是:
07 F7 37 50
101101111111011100000111

阅读全文
0 0

相关文章推荐

img
取 消
img