新浪博客

【转载】IEEE754浮点数的表示方法

2017-02-10 12:53阅读:

转载:http://blog.sina.cn/dpool/blog/s/blog_97b4973a0101j9eo.html?vt=4

1.浮点数的存储格式

浮点数在C/C++中对应floatdouble类型,我们有必要知道浮点数在计算机中实际存储的内容。
IEEE754标准中规定float单精度浮点数在机器中表示用 1 位表示数字的符号,用 8 位来表示指数,用23 位来表示尾数,即小数部分。对于double双精度浮点数,用 1 位表示符号,用 11 位表示指数,52 位表示尾数,其中指数域称为阶码。IEEE 浮点值的格式如下图所示。
【转载】IEEE754浮点数的表示方法

注意IEE754规定浮点数的阶码E采用指数e的移码-1”来表示,请记住这一点。为什么指数移码要减去1,这是IEEE754对阶码的特殊要求,以满足特殊情况,比如对正无穷的表示。

2.浮点数的规格化

若不对浮点数的表示作出明确的规定,同一个浮点数的表示就不是唯一的。例如(1.75)10可以表示成1.11×210.111×210.0111×22等多种形式。当尾数不为0时,尾数域的最高有效位为1,这称为浮点数的规格化。否则,以修改阶码同时左右移动小数点位置的办法,使其标称规格化数的形式。

2.1单精度浮点数真值

IEEE754标准中,一个规格化32位的浮点数x的真值表示为:

x=(−1)S×(1.M2e


e=E127
其中尾数域表示的值是1.M。因为规格化的浮点数的尾数域最左位总是1,故这一位不予存储,而认为隐藏在小数点的左边。
在计算指数e时,对阶码E的计算采用源码的计算方式,因此32位浮点数的8bits的阶码E的取值范围是0255。其中当E为全0或者全1时,是IEEE754规定的特殊情况,下文会另外说明。

2.1双精度浮点数真值

64位的浮点数中符号为1位,阶码域为11位,尾数域为52位,指数偏移值是1023。因此规格化的64位浮点数x的真值是:

x=(−1)S×(1.M2e


e=E1023

3.移码

移码(又叫增码)是对真值的补码的符号位取反,就可得到移码,一般用做浮点数的阶码,引入的目的是为了便于浮点数运算时的对阶操作。
对于定点整数,计算机一般采用补码的来存储。正整数的符号位为0,反码和补码等同于源码。
负整数符号位都固定为1,源码,反码和补码的表示都不相同,由原码表示法变成反码和补码有如下规则:
1)源码符号位为1不变,整数的每一位二进制数位求反得反码;
2)反码符号位为1不变,反码数值位最低位加
1得补码。
比如,以一个字节8bits来表示-3,那么[−3]=10000011[−3]=11111100[−3]=11111101,那么-3的移码就是[−3]=01111101
如何将移码转换为真值-3呢?先将移码转换为补码,再求值。

4.浮点数的具体表示

4.1十进制到机器码

10.5
0.5=(0.1)2,符号位S0,指数为e=−1,规格化后尾数为1.0
单精度浮点数尾数域共23位,右侧以0补全,尾数域:

M=[000 0000 0000 0000 0000 0000]2
阶码E:

E=[−1]1=[0111 1111]21=[0111 1110]2
对照单精度浮点数的存储格式,将符号位S,阶码E和尾数域M存放到指定位置,得0.5的机器码:

0.5=[0011 1111 0000 0000 0000 0000 0000 0000]2

十六进制表示为0.5=0x3f000000
21.5
1.5=[1.1]2,符号位为0,指数e=0,规格化后尾数为1.1
尾数域M右侧以0补全,得尾数域:

M=[1
00 0000 0000 0000 0000 0000]2
阶码E

E=[]1=[10000000]21=[01111111]2
1.5的机器码:

1.5=[0011 1111 1100 0000 0000 0000

我的更多文章

下载客户端阅读体验更佳

APP专享