rtol 和 atol 是数值计算中用于判断两个数是否“足够接近”的核心参数,分别代表相对容差(Relative Tolerance)和绝对容差(Absolute Tolerance)。
核心概念解释
在编程(尤其是科学计算,如 NumPy、SciPy、Pandas)中,直接用 == 判断浮点数是否相等是不可靠的(因为浮点数有精度误差),因此会用 rtol 和 atol 组合来定义“相等”的标准,判断逻辑如下:
两个数 a 和 b 被认为相等,当且仅当满足:
$$|a - b| \le \text{atol} + \text{rtol} \times |b|$$
1. atol(绝对容差)
- 定义:固定的绝对误差阈值,是一个常数(通常很小,如 1e-8)。
- 适用场景:当比较的数值接近 0 时,相对误差会失效(分母接近 0),此时主要靠
atol来判断。 - 例子:若
atol=1e-8,则 0.0 和 1e-9 会被认为相等,因为|0.0 - 1e-9| = 1e-9 ≤ 1e-8。
2. rtol(相对容差)
- 定义:相对误差阈值,是一个比例系数(通常在 1e-5 ~ 1e-7 之间)。
- 适用场景:当比较的数值远离 0 时,用相对误差更合理(误差随数值大小成比例)。
- 例子:若
rtol=1e-5,则 1000.0 和 1000.001 会被认为相等,因为|1000 - 1000.001| = 0.001 ≤ 1e-5 × 1000 = 0.01。
代码示例(Python NumPy)
下面用 NumPy 的 np.allclose() 函数演示 rtol 和 atol 的实际使用:
import numpy as np
# 示例1:接近0的数值(依赖atol)
a = 0.0
b = 1e-9
# 默认:rtol=1e-05, atol=1e-08
print(np.allclose(a, b)) # 输出 True(1e-9 ≤ 1e-8 + 1e-5*0 → 满足)
# 示例2:远离0的数值(依赖rtol)
c = 1000.0
d = 1000.001
print(np.allclose(c, d)) # 输出 True(0.001 ≤ 1e-8 + 1e-5*1000 → 0.001 ≤ 0.01)
# 示例3:调整容差,改变判断结果
print(np.allclose(c, d, rtol=1e-7)) # 输出 False(0.001 > 1e-8 + 1e-7*1000 → 0.001 > 0.0001)总结
rtol(相对容差):按数值大小的比例判断误差,适用于非零大数的比较。atol(绝对容差):固定误差阈值,适用于接近 0 的小数比较。- 实际使用中,两者结合能覆盖所有浮点数比较场景,避免直接用
==导致的精度问题。