正如我们所知,由于数字的二进制表示,此表达式的计算结果为False
(至少在Python中):
0.2 + 0.4 == 0.6
为了能够检查数字错误中的相等性,模块math
提供isclose
:
import math
math.isclose(0.2 + 0.4 , 0.6)
最后一个表达式按预期产生True
。
现在为什么以下表达式再次为False
?
math.isclose(0.2 + 0.4 - 0.6 , 0.0)
似乎与0.0
相比的所有内容都是False
math.isclose(1.0e-100 , 0.0)
答案 0 :(得分:16)
答案可以通过阅读documentation来解决。
math.isclose(a, b, *, rel_tol=1e-09, abs_tol=0.0)
如果值a和b彼此接近则返回True,否则返回False。
是否认为两个值是否接近是根据给定的绝对和相对容差确定的。
rel_tol是相对容差 - 它是a和b之间允许的最大差值,相对于a或b的较大绝对值。例如,要设置5%的容差,请传递rel_tol = 0.05。默认容差为1e-09,可确保两个值在大约9个十进制数字内相同。 rel_tol必须大于零。
abs_tol是最小绝对公差 - 对于接近零的比较很有用。 abs_tol必须至少为零。
如果没有错误发生,结果将是:
abs(a-b) <= max(rel_tol * max(abs(a), abs(b)), abs_tol)
您使用默认容差,这意味着使用相对容差检查。上面的等式清楚地表明了为什么你的表达式评估为false。
考虑问题中的最终表达:
math.isclose(1.0e-100 , 0.0)
将这些值插入文档中的表达式,我们有
1.0e-100 <= max(1.0e-9 * 1.0e-100, 0.0)
我认为显而易见的是,在使用默认容差执行相对容差比较时,不会将非零值视为接近零。
对于非常小的值,您应该使用绝对容差。
或者您应该重新编写测试以避免与零进行比较。