【发布时间】:2023-03-31 23:46:01
【问题描述】:
在处理浮点错误时,我发现了 pyth 数学模块的 isclose
method。此方法使用以下公式计算 a
和 b
之间的相对 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
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:了解 Python 相对 Epsilon - Python技术站