使用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
答案 0 :(得分:5)
将python中的列表与==
进行比较,逐个比较其元素。如果您想测试它是否是同一个列表,请使用is
:
>>> a == b
True
>>> a is b
False
>>> e = a
>>> a is e
True
在您的示例中,a == b
因为:
>>> 2.0 == 2.0000000000000001
True
答案 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以了解有关浮点精度的更多信息。