python断言浮动列表

时间:2011-11-29 13:04:24

标签: 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

5 个答案:

答案 0 :(得分:5)

将python中的列表与==进行比较,逐个比较其元素。如果您想测试它是否是同一个列表,请使用is

>>> a == b
True

>>> a is b
False

>>> e = a
>>> a is e
True

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

>>> 2.0 == 2.0000000000000001
True

详细了解floating point arithmetics

答案 1 :(得分:5)

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

由于here所述的原因,这几乎肯定不是你想要的。

答案 2 :(得分:5)

也许稍微偏离主题,但你没有在你的问题中提供太多的背景。

在可用的各种单元测试机器中(包括Python标准库中的unittest模块),您将找到一个名为TestCase的{​​{1}}方法,您可以使用该方法编写关于函数/方法调用的浮点结果。如果你的函数/方法返回一个浮点列表,那么很容易定义一个新的assertAlmostEqual(v1, v2, tol)方法:

TestCase

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

答案 3 :(得分:2)

具体谈论断言,一个选择是使用非常方便的功能去使用numpy测试框架:

import numpy as np
np.testing.assert_almost_equal([1.0001, 2.], [1., 2.], decimal=3)
# OK
np.testing.assert_almost_equal([1.0001, 2.], [1., 2.], decimal=6)
# NOT OK

答案 4 :(得分:1)

这与断言无关,不确定为什么要让它们参与进来。它只是一个包含两个列表比较的表达式,表达式的结果随后在断言中使用的事实并不重要。

而且,您应该阅读What Every Computer Scientist Should Know About Floating-Point Arithmetic以了解有关浮点精度的更多信息。