【问题标题】:Understanding Python Relative Epsilon了解 Python 相对 Epsilon
【发布时间】:2023-03-31 23:46:01
【问题描述】:

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

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

默认情况下,rel_tol 设置为 1e-09。根据文档,这“确保这两个值在大约 9 个十进制数字内是相同的。”

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

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 略大,这是差异,它返回 true。我现在已经在几个地方看到了这个相对的 epsilon 公式,但从来没有解释过为什么要使用它。我希望了解为什么这个公式是可以接受的,以及如何将它应用到我对isclose 的使用中。谢谢

【问题讨论】:

  • 您如何计算“相对 epsilon 比 1e-06 略大”?他们的绝对差是10^-6。 relative 差异为 10^-6/1234,小于 10^-9。所以它们在 10^−9 的相对“容差”范围内,isclose 应该返回 true。
  • 关于“为什么这个公式是可以接受的”:It is not,这样的函数不应该是通用库的一部分。 There is no general solution for comparing floating-point numbers that compensates for errors in previous operations.
  • 使用相对容差是因为浮点格式使用指数进行缩放,一些误差往往与运算结果的大小有关。但这仅适用于单个操作。当执行多个操作时,错误分析变得相当复杂。 There is an entire field of study for it. 一般来说,舍入误差既不是绝对的,也不是相对于结果的;它们取决于许多因素,isclose 无用或有害。它可能在测试中起到一些作用,但仅此而已。
  • 感谢@EricPostpischil。这是我所指的,我从公式开始:max(rel_tol * max(abs(a), abs(b)) 这将简化为1e-09*1234.000001. That computes to 0.000001234000001. This is slightly greater than 1e-06, by 2.34000001 × 10^-7`。如果我在那里犯了错误,请告诉我。我仍然不明白为什么要使用这个公式。我原以为文档意味着它精确到小数点后 9 位,但现在我读到它是指十进制数的 9 位。
  • @EricPostpischil - 我的第一个回复是在我看到你的后两个 cmets 之前写的。感谢您的详细解答。

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