Numpy的log方法为log(0)提供了-inf。这个值是可比的:
>>> np.log(0) == np.log(0)
True
现在在单元测试中,以下工作正常:
self.assertEqual(np.log(0),np.log(0))
但这失败了:
self.assertAlmostEqual(np.log(0),np.log(0))
为什么这样的行为?这是一个错误还是打算?如果打算,如何检查两个浮点值几乎相等,也正确地为-inf?
工作答案 0 :(得分:5)
单位测试文档assertAlmostEqual(a, b)默认等效于round(a-b, 7) == 0
。所以在你的情况下你有:
In [8]: np.log(0) - np.log(0)
Out[8]: nan
In [9]: round(np.log(0) - np.log(0), 7)
Out[9]: nan
In [11]: np.nan == 0
Out[11]: False
这解释了为什么你的测试失败了。
为了使它工作,请使用unittest2这里有一个例子:
import unittest2
import numpy as np
class Test_Assertions(unittest2.TestCase):
def test_float_inf(self):
self.assertAlmostEqual(float('inf'), float('inf'))
def test_numpy_inf(self):
self.assertAlmostEqual(np.log(0),np.log(0))
unittest2.main()
输出:
..
----------------------------------------------------------------------
Ran 2 tests in 0.000s
OK
N.B:在unittest2中assertAlmostEqual()
首先测试两个对象是否相等,如果是,那么结果为是,否则做魔术(几乎相等),这就是它起作用的原因。它也应该在新的python版本(2.7>)中工作,因为它们中的大多数都实现了unittest2功能(我不确定这个,因为我的工作站中没有python 2.7>)。
希望这可以帮助:)
答案 1 :(得分:4)
Inf和任何有限值之间的差异是Inf或-Inf。这是IEEE754规范的一部分。由于assertAlmostEqual
使用减法,因此可以解释行为。
以下是FSUB的英特尔x86文档中的相关表格:
要解决您的问题,您需要为Inf。
进行特殊处理答案 2 :(得分:3)
我会说-∞和-∞之间的差异可能与∞一样多。因此,它们并非“几乎相等”。
如果你想忽略这种特殊情况,那么这样的事情可能会有用:
if valueA != valueB:
self.assertAlmostEqual(valueA, valueB)