[基础] 浮点数

N bit可以表示的信息量是 2^N

32位

S--------E-------M

1位-----8位-----23位

64位

S--------E-------M

1位-----11位----52位

表示的浮点数: (-1)^S * 2^(E-127) * (1.M)B

E可以分成三种情况:

  1. E不全为0或不全为1. 这时, 浮点数就采用上面的规则表示, 即指数E的计算值减去127(或1023), 得到真实值, 再将有效数字M前加上第一位的1.
  2. E全为0时, 浮点数的指数E等于1-127 (或者1-1023), 有效数字M不再加上第一位的1, 而是还原为0.xxxxxx的小数. 这样做是为了表示±0, 以及接近于0的很小的数字.
  3. E全为1. 这时, 如果有效数字M全为0, 表示±无穷大(正负取决于符号位s); 如果有效数字M不全为0, 表示这个数不是一个数(NaN).

区间是怎么求出来的:

32 位可表示的浮点数:

2^(-23) * 2^(1-127) = 1.4012984643248170709237295832899e-45 (考虑到最小值为最低位为1的情况, 且E全为0)

2 * 2^127 = 3.4028236692093846346337460743177e+38 (1.M 表示的数小于2)

表示范围: -3.402823E38 ~ -1.401298E-45 不可见 1.401298E-45 ~ 3.402823E38

64 位:

2^(-52) * 2^(1-1023) = 4.9406564584124654417656879286822e-324

2 * 2^1023 = 1.797693134862315907729305190789e+308

表示范围: -1.797693134862316E+308 ~ -4.94065E-324 不可见 4.94065E-324 ~ 1.797693134862316E+308

在浮点数的表示范围内,有多于 99.999...% 的数在计算机中是 不能表示 的.

要把小数装入计算机,总共分3步:

  • 第一步:转换成二进制
  • 第二步:用二进制科学计算法表示
  • 第三步:表示成 IEEE 754 形式

在上面的第一步和第三步都有可能 丢失精度.

0.1 到 0.9 的 9 个小数中, 只有 0.5 可以用二进制精确的表示.

如果把 0.0 再算上, 那么就有两个数可以精确表示, 一个奇数 0.5, 一个偶数 0.0.

如果一个十进制数可以用二进制精确表示, 那么它的最后一位肯定是 5.

备注:这是个必要条件, 而不是充分条件. 一位热心网友设计出了下面的解决精度的方案. 我就不解释了, 同学们自己思考一下吧.

我有一个观点, 针对小数精度不够的问题(例如 0.1), 软件可以人为的在数据最后一位补 5, 也就是 0.15, 这样牺牲一位, 但是可以保证数据精度, 还原再把那个尾巴 5 去掉.

浮点数的二进制表示

浮点数解惑

换算工具

代码之谜(四)- 浮点数(从惊讶到思考)

代码之谜(五)- 浮点数(谁偷了你的精度?)

用定点数精确表示小数