Numpy allclose的float32与float16标准容差咨询
针对float32和float16的np.allclose标准容差建议
核心逻辑:基于浮点数精度与np.allclose的判断公式
np.allclose的判断规则是:
|a - b| <= atol + rtol * |b|
其中rtol(相对容差)对应浮点数的相对误差范围,和该精度的机器epsilon(ε,即最小的可表示的大于1的浮点数与1的差)强相关;atol(绝对容差)对应接近0时的绝对误差范围,通常取该精度下最小可表示的非零值的合理倍数。
各精度对应的推荐容差
1. float32(单精度)
- 机器epsilon
ε ≈ 1.19e-7(对应7-8位十进制有效数字) - 推荐rtol:
1e-6到1e-7(覆盖常见计算的累积误差,对应8-10倍ε);若需更宽松容错,也可使用1e-5(需注意会放过更大相对误差) - 推荐atol:
1e-4到1e-5(适配float32最小正数值的合理放大,避免接近0时误判) - 示例调用:
np.allclose(a, b, rtol=1e-6, atol=1e-4)
2. float16(半精度)
- 机器epsilon
ε ≈ 0.000977(对应3-4位十进制有效数字) - 推荐rtol:
1e-3到1e-4(匹配半精度的有效位数,对应1-10倍ε) - 推荐atol:
1e-2到1e-3(适配float16最小正数值的范围) - 示例调用:
np.allclose(a, b, rtol=1e-3, atol=1e-2)
推导依据
浮点数的有效十进制位数决定了相对误差的合理上限:
- float32的7-8位有效数字意味着,两个“相等”的计算结果相对误差不应超过1e-7(对应最后一位有效数字的波动),放宽到1e-6是为了覆盖多步计算的累积误差
- float16的3-4位有效数字对应的相对误差上限约为1e-3,这是半精度计算中能保证的最小误差范围
- atol的取值是为了处理数值接近0的场景:当
|b|极小时,rtol项趋近于0,此时需要atol提供合理的绝对误差阈值,避免因浮点数最小表示限制导致误判
内容的提问来源于stack exchange,提问作者OverLordGoldDragon
相关产品推荐
相关产品推荐

