python断言浮动列表

bph*_*bph 3 python assert

使用assert比较浮动列表似乎直接开箱即用 - 有没有人知道幕后发生了什么,例如EPSILON的价值是什么?

作为一名C程序员,这一切都让我感到不安......我原本以为断言可能只是比较指针,但似乎做了一些明智的事情:

a = [1.0,2.0]
b = [1.0,2.0]
c = [1.0,2.01]
d = [1.0, 2.0000000000000001]


assert a==b # ok
assert a==c # no go
assert a==d # ok
Run Code Online (Sandbox Code Playgroud)

eum*_*iro 5

比较python中的列表,==一个接一个地比较它的元素.如果要测试它是否是相同的列表,请使用is:

>>> a == b
True

>>> a is b
False

>>> e = a
>>> a is e
True
Run Code Online (Sandbox Code Playgroud)

在您的示例中,a == b因为:

>>> 2.0 == 2.0000000000000001
True
Run Code Online (Sandbox Code Playgroud)

阅读有关浮点算术的更多信息.

  • 顺便提一下,Python的epsilon值设置为17位有效数字:从这个比较中删除一个零将使它们不同(比较). (2认同)

bab*_*unk 5

它不是断言是比较浮点数列表,它是==运算符(或operator.eq).list.__eq__只是推迟__eq__其项目.float.__eq__它没有进行指针/标识比较,它正在进行值比较,但它没有使用任何类型的epsilon - 如果它们代表完全相同的值,则两个浮点数只会相等.

由于这里讨论的原因,这几乎肯定不是你想要的.


gur*_*lex 5

也许有点题外话,但是您在问题中没有提供太多背景信息。

在各种可用的单元测试机器(包括unittestPython标准库中的模块)中,您会找到一种TestCase称为的方法assertAlmostEqual(v1, v2, tol),可用于编写有关函数/方法调用的浮点结果的测试。如果您的函数/方法返回一个浮点数列表,那么定义一个新TestCase方法非常容易:

def assertListAlmostEqual(self, list1, list2, tol):
    self.assertEqual(len(list1), len(list2))
    for a, b in zip(list1, list2):
         self.assertAlmostEqual(a, b, tol)
Run Code Online (Sandbox Code Playgroud)

(在测试报告中提供良好的错误消息所需的工作留给读者练习)