结论

先说结论, float能表示范围为:± 3.4e38

  • 最大正数PosMax  3.402e38
  • 最小正数PosMin  1.175e-38
  • 最大负数NegMax  -1.175-38
  • 最小负数NegMin  -3.402e38

先来回顾一下float 的表达公式以及存储范围

表达公式 

 在IEEE标准中,float的表达公式为:

float数值最大 mysql float最大范围_取值

其中

float数值最大 mysql float最大范围_c语言_02

决定正负号,

float数值最大 mysql float最大范围_浮点数_03

为尾数,

float数值最大 mysql float最大范围_浮点数_04

为基数or进制,

float数值最大 mysql float最大范围_float数值最大 mysql_05

为指数

在实际应用中,编译器主要用二进制,所以公式可简化为

float数值最大 mysql float最大范围_十进制_06

采用二进制存储后,

float数值最大 mysql float最大范围_浮点数_03

的整数部分恒定为1,可以不用储存,我们将需要放入内存的小数部分称为

float数值最大 mysql float最大范围_十进制_08

,则 

float数值最大 mysql float最大范围_十进制_09

float数值最大 mysql float最大范围_float数值最大 mysql_05

存入内存时需要加上偏置值(

float数值最大 mysql float最大范围_float数值最大 mysql_11

)并且转为二进制,存入内存时的指数记为

float数值最大 mysql float最大范围_取值_12

, 则

float数值最大 mysql float最大范围_c语言_13

存储范围

再回顾一下float (32bit) 的取值范围

s--------e----------m
1位-----8位--------23位
最大正数

二进制表达float的最大值为

0 | 11111110 |11111111111111111111111 // 0x7f7fffff
s-|-----e----|------------m----------
  • 符号位
  • float数值最大 mysql float最大范围_十进制_14

  • 为0 (正数)
  • float数值最大 mysql float最大范围_取值_12

  •  = 11111110 即十进制的254,所以 
  • float数值最大 mysql float最大范围_取值_16

  •  (注意:当
  • float数值最大 mysql float最大范围_取值_12

  • 全为1即
  • float数值最大 mysql float最大范围_取值_12

  • =255时,这时表示的是无穷(inf)或者不是一个数字)
  • float数值最大 mysql float最大范围_十进制_08

  •  = 1111....1111 (23个1), 所以 
  • float数值最大 mysql float最大范围_c语言_20


最后计算最大值,二进制的表达式为:

float数值最大 mysql float最大范围_float数值最大 mysql_21

十进制的表达式为:

float数值最大 mysql float最大范围_浮点数_22

float数值最大 mysql float最大范围_c语言_23

最小正数

二进制表达float的最小正数为

0 | 00000001 |00000000000000000000000 // 0x00800000
s-|-----e----|------------m----------
  • 符号位
  • float数值最大 mysql float最大范围_十进制_14

  • 为0 (正数)
  • float数值最大 mysql float最大范围_取值_12

  •  = 00000001 即十进制的1,所以 
  • float数值最大 mysql float最大范围_十进制_26


  • float数值最大 mysql float最大范围_十进制_08

  •  = 0000...000 (23个0), 所以 
  • float数值最大 mysql float最大范围_十进制_28


最后二进制的表达式为:

float数值最大 mysql float最大范围_c语言_29

十进制的表达式为:

float数值最大 mysql float最大范围_浮点数_30

float数值最大 mysql float最大范围_c语言_31


最大负数

 二进制表达float的最大负数为

1 | 00000001 |00000000000000000000000 // 0x80800000
s-|-----e----|------------m----------

同理可得二进制的表达式为:

float数值最大 mysql float最大范围_浮点数_32

float数值最大 mysql float最大范围_取值_33

最小负数

 二进制表达float的最小负数为

1 | 11111110 |11111111111111111111111 // 0xff7fffff
s-|-----e----|------------m----------

同理可得二进制的表达式为:

float数值最大 mysql float最大范围_c语言_34

float数值最大 mysql float最大范围_取值_35

non-numbers 特殊值

最后说一下特殊值inf 、 NaN

IEEE 754 标准规定,当指数

float数值最大 mysql float最大范围_取值_12

 的所有位都为 1 时,即

float数值最大 mysql float最大范围_取值_12

= 255, 所表示的值为特殊值, 情况如下当

float数值最大 mysql float最大范围_取值_12

 = 11111111时:

  • float数值最大 mysql float最大范围_十进制_08

  • 的二进制位都为 0,则表示无穷大(inf),
  • float数值最大 mysql float最大范围_十进制_14

  • 决定是正无穷还是负无穷
    • float数值最大 mysql float最大范围_十进制_14

    •  = 0, 正无穷
    • float数值最大 mysql float最大范围_十进制_14

    •  = 1, 负无穷 
  • float数值最大 mysql float最大范围_十进制_08

  • 的二进制位不全为 0,则表示 NaN(Not a Number),也即这是一个无效的数字,或者该数字未经初始化