Python 浮点相等性测试

Python 浮点相等性测试,python,comparison,floating-point,Python,Comparison,Floating Point,python中是否有测试浮点近似相等的函数?大概 def approx_equal(a, b, tol): return abs(a - b) < tol 如果我是你,我只会使用你写的东西,或者将它放在一个单独的模块中(可能与Python没有实现的其他实用程序一起),或者放在任何需要它的代码的顶部 您还可以使用lambda表达式(我最喜欢的语言功能之一,但可能不太清楚): 近似等于λa,b,t:abs(a-b)

python中是否有测试浮点近似相等的函数?大概

 def approx_equal(a, b, tol):
     return abs(a - b) < tol

如果我是你,我只会使用你写的东西,或者将它放在一个单独的模块中(可能与Python没有实现的其他实用程序一起),或者放在任何需要它的代码的顶部

您还可以使用lambda表达式(我最喜欢的语言功能之一,但可能不太清楚):

近似等于λa,b,t:abs(a-b)

python中是否有测试浮点近似相等的函数

不能有函数,因为定义取决于上下文

def eq( a, b, eps=0.0001 ):
    return abs(a - b) <= eps
def均衡器(a、b、eps=0.0001):

return abs(a-b)另一种方法是计算两个数字的(或相对差),“用于比较两个量,同时考虑被比较事物的“大小”。Wikipedia文章中提到的两个值可用于Python中的以下比较,也可用于处理一个或两个被比较值均为零的情况:

def approx_equal(a, b, tol):
    return abs(a-b) <= max(abs(a), abs(b)) * tol

def approx_equal(a, b, tol):
    return abs(a-b) <= (abs(a)+abs(b))/2 * tol
def近似等于(a、b、tol):

return abs(a-b)比较浮点数是否相等通常是个坏主意。即使使用了公差特性,这也不是您真正想要做的

如果你想使用浮点数,一个合理的选择是重构你的算法来使用不等式,
a
,因为这更有可能实现你所期望的,错误的否定或肯定要少得多,而且最重要的是,这意味着你不必猜测它们必须是多么相等才能相等

如果不能做到这一点,另一个选择是使用精确表示。如果您的算法只包含算术运算(
+
-
*
/
),那么您可以使用理性表示,如
分数所提供。分数
,或者可能
十进制。十进制
就是您想要的(例如,金融计算)

如果您的算法无法用任意精度表示法轻松表达,另一种选择是使用区间算法(例如使用)显式管理舍入误差。

  • 对于比较数字,有
    math.isclose
  • 对于比较数字或数组,有
    numpy.allclose
  • 对于测试数字或数组,有
    numpy.testing.assert\u allclose
根据:

。。。虽然无法使数字更接近其预期的精确值,但round()函数可用于后舍入,以便具有不精确值的结果彼此具有可比性

因此,这就是我在Python中定义“isclose”函数的方式:

def isclose(a, b, ndigits):
   return round(a-b, ndigits) == 0

我通常使用5作为
ndigit
;但是,这取决于您期望的精度

我想是你写的!:)我只是想,它们可能是这方面的一个模块……好吧,一个潜在的问题是,
tol
可能只大致等于您想要的值。您不应该与单个公差值进行比较,因为非常大的数字和非常小的数字具有不同的公差。Numpy的
spating()
函数将告诉您给定浮点数与最近浮点数之间的距离,这可能是一种很好的测试方法。Numpy的
spating
函数的文档位于(在普通谷歌搜索中不会显示)。这非常好,谢谢。(为了以防万一,我会把这个问题留一天。)@NeilG:好吧,让我们看看一位大师是否能在这个问题上找到一个更优雅的解决方案:没有理由在这里使用lambda,较短的代码不会获得积分,否则代码完全相同。你甚至给它起了个名字…@Rafe Ketterr-是的,但把它想象成麻醉剂。当然,你爱他们。但总有一天,你会在水泥地上汗流浃背地醒来,然后想“为什么这段代码只有在我向后阅读时才有意义?”在Python语言中,我发现最好使用“def”关键字来定义命名函数。我也经常使用“lambda”,但仅在不需要定义名称的情况下使用,例如min()函数上的键参数。我经常在命名函数中定义命名函数,作为命名for循环体的一种方法!您将在其他地方看到,在Python中lambda被严格限制为仅作为一个表达式,这在Python中是非常糟糕的,因为语句和表达式是两个不同的东西。仅在不需要名称的情况下使用lambdas。在以两种不同方式计算值的测试中如何?在这种特定情况下,区间数学是一种方法。每个操作都会跟踪它将导致的舍入误差量。既然他必须自己实现它,他就不能为他的应用程序适当地实现它吗?你基本上是在用一个问题来回答他的问题。“有没有一个函数可以测试python中的浮点近似等式?”这个问题——正如所问的那样——是一个糟糕的问题。答案是无用的“不”。既然这个问题不好,我们就必须继续问一个相关的问题,比如“为什么不?”更有用的相关问题的答案是“不可能有函数”。用单数表示。这不是内置的,因为内置没有意义。你总是要自己去实现它。“答案”是提问者已经知道的无用的“不,没有函数”。不要指定任意的ε值。定义如下:
从sys.float\u info import epsilon
@Vince您使用的epsilon值必然取决于您进行比较的环境-特别是,您不能到处使用机器epsilon(
sys.float\u info.epsilon
FLT/DBL\u epsilon
)。是的,可以用机器ε乘以任意值
def eq( a, b, eps=0.0001 ):
     return abs( a - b ) / abs(a) <= eps
def eq( a, b, eps=0.0001 ):
    return abs(math.log( a ) - math.log(b)) <=  eps
def approx_equal(a, b, tol):
    return abs(a-b) <= max(abs(a), abs(b)) * tol

def approx_equal(a, b, tol):
    return abs(a-b) <= (abs(a)+abs(b))/2 * tol
def isclose(a, b, ndigits):
   return round(a-b, ndigits) == 0