电气和电子工程师协会(IEEE)定义了几种存储浮点数的标准。最常用的就是单精度和双精度。
单精度数据格式采用总共32位(4字节)来存储一个浮点表示法的实数。符号占用1位,指数占用8位(采用余127码),尾数使用23位(无符号数)。
双精度数据格式采用总共64位(8字节)来存储一个浮点表示法的实数。符号占用1位,指数占用11位(采用余1023码),尾数使用52位(无符号数)。
下面以单精度为例讨论浮点数的表示方法:
符号位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;
5.75=101.11=1.0111∗22
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;
指数E&#61;0时&#xff0c;有效数最高位为0&#xff0c;而不再是1&#xff0c;只有当0<E<28−1
时&#xff0c;有效数最高位为1。当指数位为0&#xff0c;且位数位为0时&#xff0c;表示&#43;-0。
指数E&#61;28−1且尾数部分为0&#xff0c;则表示正无穷大或者负无穷大&#xff0c;视符号位而定。
百度百科对这几条规则解释的很清楚&#xff0c;参见IEEE754
由上面的规则可以推导出32位浮点数的表示范围。
正最大值&#xff1a;
S | E | M |
---|---|---|
0 | 11111110 | 11111111111111111111111 |
S | E | M |
---|---|---|
0 | 00000001 | 00000000000000000000001 |