IEEE 754中Epsilon释义及大数运算精度损失原因问询
为什么第二个示例的精度损失更大?
你的猜想完全正确,核心原因就是浮点数的尾数截断误差会被指数放大,数值越大(指数越高),误差的影响越显著。
关键概念梳理
- Number.EPSILON:IEEE 754双精度浮点数中,能加到1上得到不同表示的最小正数,它代表了该精度下的最小相对误差阈值——如果两个数的差小于它,会被浮点数视为“相等”。
- 双精度浮点数存储规则:用64位二进制表示,其中52位是尾数(隐含1位最高有效位,共53位有效精度),11位是指数。像0.1、0.2这类十进制小数,转二进制是无限循环的,必须截断到52位尾数,这就会引入初始误差。
两个示例的误差差异分析
第一个示例:
0.1 + 0.2 - 0.3
这三个数量级极小(10-1级别),对应的指数也很小(约2-4)。虽然转二进制时都有截断误差,但误差被小指数缩放后,最终计算结果的总误差小于Number.EPSILON,所以Number.EPSILON > 计算结果返回true。第二个示例:
10000.1 + 10000.2 - 20000.3
这三个数量级是104级别,对应的指数约为214。同样的尾数截断误差,被大指数放大后,实际的绝对误差远大于第一个示例的误差。最终计算结果的总误差超过了Number.EPSILON,所以Number.EPSILON > 计算结果返回false。
本质逻辑
双精度浮点数的相对误差大致固定(对应约15-17位十进制有效数字),但绝对误差会随数值大小线性增长——数值越大,相同相对误差对应的绝对误差就越大。当数值大到一定程度,原本微小的尾数截断误差会被指数放大到超过EPSILON阈值,从而表现出更明显的精度损失。
内容的提问来源于stack exchange,提问作者Ben Aston
相关产品推荐
相关产品推荐

