处理浮点精度的 Python 不等式比较

Python inequality comparison dealing with floating point precision

提问人:at. 提问时间:1/19/2023 更新时间:1/19/2023 访问量:119

问:

我需要将浮点数与不等式进行比较:

if x >= y:

但是,由于浮点精度问题,有时这在应该成功时会失败 ( 和 )。我正在考虑创建一个 epsilon:x = 0.21y= 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)

python-3.x numpy 浮点精度 不等式

评论

1赞 Grismar 1/19/2023
既然你真的只是在寻找一个 ,为什么不简单地定义这个函数呢?开销是不可接受的吗?greater_than_or_close(x, y)
0赞 at. 1/19/2023
@Grismar这不是开销。这似乎是由于令人惊讶的浮点精度问题而容易出错的函数之一,尽管看起来非常简单(似乎非常简单)。或者有一种更有效的方法可以做到这一点(这只是最微小的奖励)。一般来说,我尝试为这类事情找到标准函数,这样就可以减少代码、维护和其他开发人员对代码的培训。x >= y
0赞 Eric Postpischil 1/19/2023
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.isclosemath.isclose

答:

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

您可以在任何需要的地方导入它。

您的评论说:“这似乎是由于令人惊讶的浮点精度问题而我很容易出错的函数之一”,但由于这仅依赖于实际大于 或使用该函数,因此似乎不存在风险?xymath.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
他们也已经提供了定义函数的想法(“很简单,我只需要创建一个函数”)。