结论
先说结论, float能表示范围为:± 3.4e38
- 最大正数PosMax 3.402e38
- 最小正数PosMin 1.175e-38
- 最大负数NegMax -1.175-38
- 最小负数NegMin -3.402e38
先来回顾一下float 的表达公式以及存储范围
表达公式
在IEEE标准中,float的表达公式为:
其中
决定正负号,
为尾数,
为基数or进制,
为指数
在实际应用中,编译器主要用二进制,所以公式可简化为
采用二进制存储后,
的整数部分恒定为1,可以不用储存,我们将需要放入内存的小数部分称为
,则
存入内存时需要加上偏置值(
)并且转为二进制,存入内存时的指数记为
, 则
存储范围
再回顾一下float (32bit) 的取值范围
s--------e----------m
1位-----8位--------23位
二进制表达float的最大值为
0 | 11111110 |11111111111111111111111 // 0x7f7fffff
s-|-----e----|------------m----------
- 符号位
- 为0 (正数)
- = 11111110 即十进制的254,所以
- (注意:当
- 全为1即
- =255时,这时表示的是无穷(inf)或者不是一个数字)
- = 1111....1111 (23个1), 所以
最后计算最大值,二进制的表达式为:
十进制的表达式为:
最小正数二进制表达float的最小正数为
0 | 00000001 |00000000000000000000000 // 0x00800000
s-|-----e----|------------m----------
- 符号位
- 为0 (正数)
- = 00000001 即十进制的1,所以
- = 0000...000 (23个0), 所以
最后二进制的表达式为:
十进制的表达式为:
二进制表达float的最大负数为
1 | 00000001 |00000000000000000000000 // 0x80800000
s-|-----e----|------------m----------
同理可得二进制的表达式为:
最小负数二进制表达float的最小负数为
1 | 11111110 |11111111111111111111111 // 0xff7fffff
s-|-----e----|------------m----------
同理可得二进制的表达式为:
non-numbers 特殊值最后说一下特殊值inf 、 NaN
IEEE 754 标准规定,当指数
的所有位都为 1 时,即
= 255, 所表示的值为特殊值, 情况如下当
= 11111111时:
- 的二进制位都为 0,则表示无穷大(inf),
- 决定是正无穷还是负无穷
- = 0, 正无穷
- = 1, 负无穷
- 的二进制位不全为 0,则表示 NaN(Not a Number),也即这是一个无效的数字,或者该数字未经初始化