close
接近这个词具有哲学含义,我们可以分为绝对接近和相对接近。
- 比如规定两个数相差3以内,就是接近。
- 比如规定两个数相差两者绝对值最大值的1%以内,就是接近。
稍微解释一下后者,例如有995和1000,两者绝对值最大值是1000,1%=10。因而995和1000是接近的。
如果按照前者,995和1000是不接近的。
我们发现,各有各的好处。
math
import math
math.isclose()综合了绝对接近和相对接近两个选项:
math.isclose(a, b, rel_tol=1e-09, abs_tol=0.0)
其中rel_tol
就是相对忍耐值,abs_tol
就是绝对忍耐值。到时候会判断两个忍耐值哪个最大,然后取那个忍耐值作为判断是否接近的依据。简而言之就是下面这个公式:
abs(a-b) <= max(rel_tol * max(abs(a), abs(b)), abs_tol).
结果是一个布尔值。
numpy
import numpy as np
这个api也是同理,但是可以同时比较多个,多个都接近,那么返回接近。
np.allclose(a, b, rtol=1e-05, atol=1e-08)
其有一点比较有意思,和上面不同,上面是绝对忍耐和相对忍耐的最大值作为最终的忍耐,这里是绝对忍耐加上相对忍耐(abs(b)*rtol+atol
)
a=np.array([1,2])
b=np.array([2,3])
np.allclose(a,b,rtol=0.1,atol=0.9)
True
可以验证,去掉任何一个忍耐值,结果都会是False。