IEEE 754与传统浮点数中0.1+0.2-0.3的结果差异问询
Knuth传统浮点数下0.1+0.2-0.3的计算结果
答案是:会严格得到0。
具体原因:
- 先说说IEEE 754的问题:0.1、0.2这类十进制有限小数,没法用二进制浮点数精确存储,只能存近似值。相加后的结果和0.3的二进制近似值有微小偏差,所以
0.1+0.2-0.3会得到一个极小的非零值。 - 而Knuth在《计算机程序设计艺术》里定义的传统浮点数,是十进制浮点模型:尾数(significand)存储精确的十进制数字,指数对应10的幂次。在这个模型里:
- 0.1精确表示为
1 × 10^-1 - 0.2精确表示为
2 × 10^-1 - 两者相加得到
3 × 10^-1(也就是精确的0.3) - 再减去精确的0.3,结果必然是严格的0,不存在任何误差。
- 0.1精确表示为
这种十进制浮点模型天生适配十进制有限小数的运算,只要运算过程中尾数的存储位数足够容纳结果的有效数字,就能得到精确结果。
内容的提问来源于stack exchange,提问作者nonopolarity
相关产品推荐
相关产品推荐

