测试浮点相等性

2024-06-14 11:53:33 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

我的用例类似于谷歌的C++测试库GTest.h如何定义^ {CD1>}。

下面是一个例子:

def bernoulli_fraction_to_angle(fraction):
    return math.asin(sqrt(fraction))
def bernoulli_angle_to_fraction(angle):
    return math.sin(angle) ** 2
def test_bernoulli_conversions():
    assert(approx_equal(bernoulli_angle_to_fraction(pi / 4), 0.5, 1e-4))
    assert(approx_equal(
              bernoulli_fraction_to_angle(bernoulli_angle_to_fraction(0.1)),
                0.1, 1e-4))

Tags: to函数returndefmathabsassertequal
3条回答
  • 为了比较数字,从Python 3.5开始,就有了按PEP 485math.isclose
  • 对于比较数字或数组,有numpy.allclose
  • 对于测试数字或数组,有numpy.testing.assert_allclose

Is there a function to test floating point approximate equality in python?

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

def eq( a, b, eps=0.0001 ):
    return abs(a - b) <= eps

不总是有效的。在某些情况下

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

可能更合适。

我看不出你怎么能要求一个(单一的)函数把所有的数学选择组合起来。因为这取决于应用程序。

另一种方法是计算两个数字的relative change(或相对差),即“用于比较两个数量,同时考虑到被比较事物的‘大小’”。Wikipedia文章中提到的两个formulas可以用于类似于Python中的以下比较中,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

两种情况下的计算值都是无单位分数。在第一种情况下,基线值是两个数字的最大绝对值,在第二种情况下是它们的平均绝对值。本文对每一种方法进行了较为详细的论述,并对其利弊进行了分析。如果在比较之前乘以100,后者可以变成percentage difference(其中tol成为一个百分比值)。请注意,文章建议,如果变化值“本身就是一个百分比,那么最好用百分比来讨论它的变化”——即绝对变化。

这两种方法(显然)都需要比简单地计算两个数之差的绝对值多一点的计算,这可能是一种考虑。

相关问题 更多 >