提问人:at. 提问时间:1/19/2023 更新时间:1/19/2023 访问量:119
处理浮点精度的 Python 不等式比较
Python inequality comparison dealing with floating point precision
问:
我需要将浮点数与不等式进行比较:
if x >= y:
但是,由于浮点精度问题,有时这在应该成功时会失败 ( 和 )。我正在考虑创建一个 epsilon:x = 0.21
y= 0.21000000000000002
epsilon = 0.000000001
if x >= y - epsilon:
我宁愿为此使用标准机制。Python 有一个用于平等的函数,但我找不到任何用于不平等的东西。所以我必须写这样的东西:math.isclose
import math
if x > y or math.isclose(x, y):
我必须在我的应用程序中做很多事情......很简单,我只需创建一个函数。我的问题是,是否有一种标准方法来处理不平等和浮动?有类型函数吗?numpy.greater_or_equal(x, y)
答:
-1赞
Grismar
1/19/2023
#1
既然您指出函数调用的开销并不是真正的问题,为什么不简单地提供:
def greater_than_or_close(x: float, y: float) -> bool:
from math import isclose
return x > y or isclose(x, y)
您可以在任何需要的地方导入它。
您的评论说:“这似乎是由于令人惊讶的浮点精度问题而我很容易出错的函数之一”,但由于这仅依赖于实际大于 或使用该函数,因此似乎不存在风险?x
y
math.isclose()
(或者更确切地说,将导入保留在函数之外:)
import math
def greater_than_or_close(x: float, y: float) -> bool:
return x > y or math.isclose(x, y)
评论
0赞
Kelly Bundy
1/20/2023
这就是他们已经在问题中展示/提到的内容。他们问的是是否有“标准方法”,我根本没有看到你解决这个问题。
0赞
Grismar
1/20/2023
我认为定义函数是标准方式,更何况他们自己已经提供了更有效但可读性较差的替代方案。
0赞
Kelly Bundy
1/20/2023
他们也已经提供了定义函数的想法(“很简单,我只需要创建一个函数”)。
评论
greater_than_or_close(x, y)
x >= y
x > y or isclose(x, y)
等效于 ,或者,填充默认公差并略微简化 。这不是对使用或此测试的认可;使用表示应用程序中的某些内容设计不当,尤其是当它与默认公差一起使用时。x - y > -max(rel_tol * max(abs(a), abs(b)), abs_tol)
x - y > -1e-9 * max(abs(a), abs(b))
math.isclose
math.isclose