了解 Python 相对 Epsilon

Understanding Python Relative Epsilon

在处理浮点错误时,我发现了 pyth 数学模块的 isclose method。此方法使用以下公式计算 ab 之间的相对 epsilon:

max(rel_tol * max(abs(a), abs(b))

默认情况下,rel_tol 设置为 1e-09。根据文档,这个 "assures that the two values are the same within about 9 decimal digits."

让我们考虑以下示例...

a=1234.000001
b=1234

# the relative epsilon, as calculated with the above formula, would be 0.000001234000001
# so math.isclose returns true
math.isclose(a,b)

根据文档,这似乎应该是 false,因为它在小数点后 9 位内不准确。但是由于相对 epsilon 比 1e-06 稍微大一点,这就是区别,它是 returns true。我现在已经在几个地方看到了这个相对的 epsilon 公式,但从来没有解释为什么使用它。我希望理解为什么这个公式是可以接受的,以及我如何将它应用到我对 isclose 的使用中。谢谢

您可能混淆了差异和相对容差。

你是对的,a和b之间的差是1e-6,而且两个数只相同到小数点后第六位

但是,Python 文档讨论的是 十进制数字 ,其中包含句点之前的数字。因此这两个数也是相同的第9位小数位.

使用相对公差而不是差异的原因在处理小数字时很容易看出。如果你所有的数字都小于 1e-10 而我们要使用差异,我们永远无法比较两个浮点数。但是,如果您使用相对公差,则可以更好地衡量两个浮点数之间的 "relative distance"。

关于 isclose 的用途,一个例子就是传感器测量。如果您编写等待信号稳定为浮点值的代码,您不想测试测量值是否等于所需值,因为舍入误差可能永远不会发生,而是等待测量值接近期望值。

希望对您有所帮助