关于浮点数在内存当中的表示
1.IEEE754标准
电气和电子工程师协会(IEEE)定义了几种存储浮点数的标准。最常用的就是单精度和双精度。
单精度数据格式采用总共32位(4字节)来存储一个浮点表示法的实数。符号占用1位,指数占用8位(采用余127码),尾数使用23位(无符号数)。
双精度数据格式采用总共64位(8字节)来存储一个浮点表示法的实数。符号占用1位,指数占用11位(采用余1023码),尾数使用52位(无符号数)。
2.单精度表示方法
下面以单精度为例讨论浮点数的表示方法:
符号位S:占用1位,0表示正,1表示负;
指数位E:指数为占用8位,采用余127码系统,可表示的值为0~255,其中,0和255(即8位全部为1)是两个特殊值,后面会详细讨论。姑且认为指数位可表示的值为1~254,对应的指数范围是-126~127.
尾数位M:尾数位占用23位,表示小数位,范围从0~2^23-1.
一个实数存储为浮点数格式的步骤是:
在S中存储符号(0或1)
将数字转换为二进制
规范化
找到E,M的值
连接S,E,M
例子:写出十进制-5.75的127余码表示。
符号位为1,S=1;
<nobr> 5.75=101.11=1.0111∗22 </nobr>
E=2+127=129,M=0111
因此,5.75的单精度表示方法为:
1 10000001 10110000000000000000000
类似的,对于-161.875有:
161.875=10100001.111=1.0100001111*2^7
S=1;
E=7+127=134=10000110;
M=0100001111;
//单精度表示为:
1 10000110 0100001111;
3.几个特殊情况
指数E=0时,有效数最高位为0,而不再是1,只有当 <nobr> 0<E<28−1 </nobr>
时,有效数最高位为1。当指数位为0,且位数位为0时,表示+-0。指数 <nobr> E=28−1 </nobr>且尾数部分为0,则表示正无穷大或者负无穷大,视符号位而定。
- 指数 <nobr> E=28−1 </nobr>且尾数部分不为0,则表示这不是一个数。
百度百科对这几条规则解释的很清楚,参见IEEE754
4.上溢和下溢
由上面的规则可以推导出32位浮点数的表示范围。
正最大值:
S | E | M |
---|---|---|
0 | 11111110 | 11111111111111111111111 |
正最小值:
S | E | M |
---|---|---|
0 | 00000001 | 00000000000000000000001 |
负最大值:
负最小值: