IEEE754单精度数的表示范围
有同学问单精度的数据表示范围为什么是下面的范围:

首先解释上面是10进制的科学计数法,E+38代表10^38,E-45代表10^-45。

计算机中浮点表示大都采用IEEE754标准,其中单精度占4B(32位):
1 8-bit 23-bit

数符S:0表示正数,1表示负数;
阶码E:8位。采用偏置为127的移码,
即: 阶码 = 127 + 阶数数值
或 阶数数值 = 阶码 - 127
并规定阶码的取值范围为:1~254,阶码值0和255用于表示特殊数值。所以阶数的取值范围:-126~127.
尾数M:23位,采用原码,采用规格化或非规格化表示。对于其中规格化数原码来说,其尾数的最左边一位必定为1(特殊值和非规格化数除外),所以可以把这个1丢掉,而把其后的23位放入尾数字段中。这样,IEEE754中的23位尾数实际上是表示了24位的有效数字。
关于IEEE754标准更详细的定义可查相关资料,这里不赘述了。
有了上面的解释,我们算一下单精度的数据表示范围:
1)最小正数:
0 00000001 00000000000000000000001 (二进制形式)
0.00000000000000000000001*2^-126 = 2^-23*2^-126
(非规格化) =2^-149
≈ +1.40129846e-45
2)最大正数:
0 11111110 11111111111111111111111 (二进制形式)
1.1111111111111111111111*2^127 =( 1+2^-1+……2^-23 )*2^127
等比数列求和 (规格化) ≈ 1.99999988*1.701411834e+38
a1*(1-q^n)/1-q ≈+3.402823465e+38
3)最小负数:
1 11111110 11111111111111111111111 (二进制形式)
-1. 11111111111111111111111*2^127 =-( 1+2^-1+……2^-23 )*2^127
(规格化) ≈1.99999988*1.701411834e+38
≈-3.402823465e+38
4)最大负数:
1 00000001 00000000000000000000001 (二进制形式)
-0.00000000000000000000001*2^-126 = -2^-23*2^-126
(非规格化) =-2^-149
≈ -1.40129846e-45
通过上面具体计算,能看到浮点表示数据存在溢出问题:
