分类: C/C++
2006-07-06 10:13:11
比如:53004d3e
二进制表示为:
01010011000000000100110100111110
按照1个符号,8个指数,23个小数位划分
0
10100110
00000000100110100111110
小数位就不对了???
正确的结果转出来应该是551051722752.0
不知道该怎么算?
好,我们根据IEEE的浮点数表示规则划分,得到这个浮点数的小数位是:
00000000100110100111110
那么它的二进制表示就应该是:
1.000000001001101001111102 × 239
这是怎么来的呢? 别急,听我慢慢道来。
标准化公式中的M要求在规格化的情况下,取值范围1
正因为如此,我们才需要对原始的整数二进制表示做偏移,偏移多少呢?偏移2E。
这个“E”怎么算?上面的239怎么得来的呢?浮点数表示中的8位指数为就是告诉这个的。我们知道:
E = e-Bias
那么根据指数位:
101001102=>16610
即e=166,由此算出E=e-Bias=166-127=39,就是说将整数二进制表示转为标准的浮点数二进制表示的时候需要将小数点左移39位,好,我们现在把它还原得到整数的二进制表示:
1 00000000100110100111110 0000000000000000
1│←───── 23─────→│←─── 16───→│
23+16=39,后面接着就是小数点了。
拿出计算器,输入二进制数1000000001001101001111100000000000000000
转为十进制数,不正是:
551051722752
么:)
通过这个例子,我介绍了将整数二进制表示转浮点数二进制表示的逆过程,还是希望大家不但能掌握转化的方法,更要理解转化的基本原理。
顺便补充一下,IEEE对双精度浮点数(C语言中的double)规定的保存格式是1个符号位,11个指数位,52个小数位,长度为64bit,转换的方法与单精度浮点数是一样的,关于这点网上的文章很少提到故特此补充一下,相信通过两篇文章的介绍读者能掌握如何转换。
chinaunix网友2008-09-21 22:47:54
请教 时间:2006-10-16 16:14:41 IP地址:210.77.10.★ 1 00000000100110100111110 0000000000000000 1│←───── 23─────→│←─── 16───→│ 中第一位的1是怎么出来的呢? 所有的小数都是从左边第一个1开始计算的,所以统统没有必要在计算中再保留这个数。。这是IEEE的规定。 主楼的文章写的很清楚了,谢谢!
chinaunix网友2008-09-21 22:47:54
请教 时间:2006-10-16 16:14:41 IP地址:210.77.10.★ 1 00000000100110100111110 0000000000000000 1│←───── 23─────→│←─── 16───→│ 中第一位的1是怎么出来的呢? 所有的小数都是从左边第一个1开始计算的,所以统统没有必要在计算中再保留这个数。。这是IEEE的规定。 主楼的文章写的很清楚了,谢谢!