0%

探析计算机浮点数精度丢失

探析计算机浮点数精度丢失

国际标准IEEE 754

$$
V=(-1)^s\times M \times 2^E
$$

1
2
3
4
5
s:(sign)表示符号位
M: (singificand)M是一个二进制小数,范围为1-2
M: 默认M以1开头,所以舍弃M的第一位
E: (exponent)权重,可以为负数
E: 为了应对指数为负数的情况,E的实际值=E-127(1023)

表示

单精度的表示:1(符号位) + 8(指数位) + 23(有效数字)

双精度的表示:1(符号位) + 11(指数位) + 52(有效数字)

image-20220718213629406

image-20220718215457463

实例

image-20220718215825751

对精度有要求的场景,不要使用浮点数!必须使用十进制运算类库!比如java中的Decimal类。

需要特别注意的是,由于十进制运算库无法直接利用 CPU 基于二进制位的运算能力,执行效率要比浮点数差很多。

参见:https://fasionchan.com/posts/ieee754-traps/