为了账号安全,请及时绑定邮箱和手机立即绑定

测试浮点相等

测试浮点相等

桃花长相依 2019-11-02 09:55:31
有功能可以在python中测试浮点近似相等吗?就像是, def approx_equal(a, b, tol):     return abs(a - b) < tol我的用例类似于Google的C ++测试库gtest.h的定义EXPECT_NEAR。这是一个例子:def bernoulli_fraction_to_angle(fraction):    return math.asin(sqrt(fraction))def bernoulli_angle_to_fraction(angle):    return math.sin(angle) ** 2def 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))
查看完整描述

3 回答

?
四季花海

TA贡献1811条经验 获得超5个赞

为了比较数字,从Python 3.5开始math.isclose,按照PEP 485进行。

为了比较数字或数组,有numpy.allclose。

对于测试数字或数组,有 numpy.testing.assert_allclose


查看完整回答
反对 回复 2019-11-02
?
动漫人物

TA贡献1815条经验 获得超10个赞

另一种方法是计算两个数字的相对变化(或相对差异),“用于比较两个数量,同时考虑要比较的事物的'大小'”。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

两种情况下的计算值都是无单位的分数。在第一种情况下,基线值是两个数字的最大绝对值,在第二种情况下,基线值是它们的平均绝对值。本文将更详细地讨论每一个,以及它们的优缺点。如果在比较之前乘以100(变为百分比值),则后者可能会变成百分比差异tol。请注意,该文章建议,如果变化的值“本身就是百分比,则最好使用百分比来谈论其变化”,即绝对变化。


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


查看完整回答
反对 回复 2019-11-02
?
翻过高山走不出你

TA贡献1875条经验 获得超3个赞

有功能可以在python中测试浮点近似相等吗?


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


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

哪个更合适。


我看不到如何要求一个(单个)函数将所有数学选择组合在一起。由于这取决于应用程序。


查看完整回答
反对 回复 2019-11-02
  • 3 回答
  • 0 关注
  • 325 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信