使用math.isclose函数,其值接近0

时间:2016-02-10 20:08:52

标签: python python-3.x math floating-point precision

正如我们所知,由于数字的二进制表示,此表达式的计算结果为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)

1 个答案:

答案 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)

我认为显而易见的是,在使用默认容差执行相对容差比较时,不会将非零值视为接近零。

对于非常小的值,您应该使用绝对容差。

或者您应该重新编写测试以避免与零进行比较。