[基础] 浮点数
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可以分成三种情况:
- E不全为0或不全为1. 这时, 浮点数就采用上面的规则表示, 即指数E的计算值减去127(或1023), 得到真实值, 再将有效数字M前加上第一位的1.
- E全为0时, 浮点数的指数E等于1-127 (或者1-1023), 有效数字M不再加上第一位的1, 而是还原为0.xxxxxx的小数. 这样做是为了表示±0, 以及接近于0的很小的数字.
- 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 去掉.
用定点数精确表示小数