结论
先说结论, 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----------m1位-----8位--------23位
最大正数
二进制表达float的最大值为
0 | 11111110 |11111111111111111111111 // 0x7f7fffffs-|-----e----|------------m----------
- 符号位为0 (正数)
- = 11111110 即十进制的254,所以(注意:当全为1即=255时,这时表示的是无穷(inf)或者不是一个数字)
- = 1111….1111 (23个1), 所以
最后计算最大值,二进制的表达式为:
十进制的表达式为:
最小正数
二进制表达float的最小正数为
0 | 00000001 |00000000000000000000000 // 0x00800000s-|-----e----|------------m----------
- 符号位为0 (正数)
- = 00000001 即十进制的1,所以
- = 0000…000(23个0), 所以
最后二进制的表达式为:
十进制的表达式为:
最大负数
二进制表达float的最大负数为
1 | 00000001 |00000000000000000000000 // 0x80800000s-|-----e----|------------m----------
同理可得二进制的表达式为:
最小负数
二进制表达float的最小负数为
1 | 11111110 |11111111111111111111111 // 0xff7fffffs-|-----e----|------------m----------
同理可得二进制的表达式为:
non-numbers 特殊值
最后说一下特殊值inf 、 NaN
IEEE 754 标准规定,当指数 的所有位都为 1 时,即= 255, 所表示的值为特殊值, 情况如下
当= 11111111时:
- 的二进制位都为 0,则表示无穷大(inf),决定是正无穷还是负无穷
- = 0, 正无穷
- = 1, 负无穷
- 的二进制位不全为 0,则表示 NaN(Not a Number),也即这是一个无效的数字,或者该数字未经初始化
参考
单精度浮点数的取值,表示以及相关