现在的位置: 首页 > 综合 > 正文

浮点数在intel上的二进制存储结构,以及如何判断一个浮点数是否为整数

2018年02月16日 ⁄ 综合 ⁄ 共 1329字 ⁄ 字号 评论关闭

http://blog.csdn.net/yangjun111122/archive/2011/03/18/6259900.aspx

在这里,我就不解释那些ieee的术语,因为大家只
要一搜索,到处都有。这里我用一个直观的实例解释float浮点数在intel机器上的存储方式,并给出计算方法,让人能一目了然的明白如何将二进制存储
的浮点数的转换成我们常见的十进制形式,并解释为何有的浮点数不能被精确表示,如12.34常常被表示为12.3400001526。

对于十进制数12.34如何转换成二进制存储的浮点数,我们需要分3步走

1、先将12.34转换成二进制表示,整数和小数部分分别单独转换

整数部分是不停的除二,将余数由后向前排列

即12=1100

小数部分是不停的乘二,将乘积的整数部分由前向后排列

即0.34=0.01010111......,我们发现小数部分*2永远乘不尽,就是说不可能出现没有小数的时候,所以此浮点数就无法被精确的转换成二进制。

将整数与小数部分合并得,12.34的二进制表示即 12.34->1100.01010111......

2、将二进制数1100.01010111用科学计数法表示成:

1100.01010111->1.10001010111*(2的3次方)

此时就可以将上面的二进制位填入下表中了


32位

整个浮点数共需要32位共4个字节来表示

31位为符号位,1代表负数,0代表正数,数字0的此位同正数

23~30位共8个比特,存储的是科学计数法的指数,即二的多少次方,上例为3

0~22为共23个bit,存储的是科学计数法的小数部分,因为根据科学计数法,整数部分总为1所以存储时可省略,以便多出一位来表示

即12.34->01000001 01001010 01110000 10100100

顺序的表示就是41 45 70 A4

3、此步就是将上面的字节顺序翻转过来,变成A4 70 45 41 。

为什么要翻转?

因为在intel机器中,我们内存中使用的是小头字序,就是说低字节的放到前头,哪个方向是前头?

就是我们内存表示时是这样的

0字节 1字节 2字节 3字节 4字节 5字节.......

低字节在前面

所以上面的字节在内存中的正确排序是

A4 70 45 41

跟纸上表示正好倒过来了,谁叫我们纸上表示时把高字节放到前面呢!!!

64位double双精度浮点数,我就不说了,一样的做法

只不过符号位1位,指数位为11位,共64位,8个字节存储


ps:以上文字是我转载的,原文地址为:
http://hi.baidu.com/jijun0418/blog/item/4a74f35492d2085f574e0001.html

    接下来,我要介绍,如何在intel上判断一个浮点数是否为整数

 

【上篇】
【下篇】

抱歉!评论已关闭.