结论

先说结论, 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),也即这是一个无效的数字,或者该数字未经初始化

参考

单精度浮点数的取值,表示以及相关