IEEE浮点数表示法 天堂雨(124059489)

题目:
(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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值