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))为什么会有这样的行为?这是一个bug还是有意为之?如果需要的话,我如何检查两个浮点值是否几乎相等,并且在-inf下也能正常工作?
发布于 2011-03-21 22:31:44
在unittest的文档中,默认情况下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注:在unittest2 assertAlmostEqual()中,首先测试两个对象是否相等,如果是,则结果为是,否则使用魔法(几乎相等),这就是为什么它有效。它也应该可以在新的python版本(2.7 >)中工作,因为它们中的大多数都实现了unittest2功能(我不确定这一点,因为我的工作站中没有Python2.7>)。
希望这能有所帮助:)
发布于 2011-03-21 19:31:53
Inf和任何有限值之间的差异不是Inf就是-Inf。这是IEEE754规范的一部分。由于assertAlmostEqual使用减法,这可以解释这种行为。
以下是英特尔x86 FSUB文档中的相关表:

为了解决你的问题,你需要Inf的特殊情况处理。
发布于 2011-03-21 19:27:46
我要说的是,-∞和-∞之间的区别可以和∞一样大。因此,它们并不是真正的“几乎相等”。
如果您想忽略这种特殊情况,那么下面这样的代码可能会很有用:
if valueA != valueB:
self.assertAlmostEqual(valueA, valueB)https://stackoverflow.com/questions/5376853
复制相似问题