首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么assertAlmostEqual(-inf,-inf)会失败?

为什么assertAlmostEqual(-inf,-inf)会失败?
EN

Stack Overflow用户
提问于 2011-03-21 19:15:14
回答 3查看 1.5K关注 0票数 3

Numpy的log方法给出了log(0)的-inf。该值具有可比性:

代码语言:javascript
复制
>>> np.log(0) == np.log(0)
True

现在,在单元测试中,以下代码可以正常工作:

代码语言:javascript
复制
self.assertEqual(np.log(0),np.log(0))

但这失败了:

代码语言:javascript
复制
self.assertAlmostEqual(np.log(0),np.log(0))

为什么会有这样的行为?这是一个bug还是有意为之?如果需要的话,我如何检查两个浮点值是否几乎相等,并且在-inf下也能正常工作?

EN

回答 3

Stack Overflow用户

发布于 2011-03-21 22:31:44

在unittest的文档中,默认情况下assertAlmostEqual(a, b)等同于round(a-b, 7) == 0。因此,在您的情况下,您需要:

代码语言:javascript
复制
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,下面是一个例子:

代码语言:javascript
复制
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()

输出:

代码语言:javascript
复制
..
----------------------------------------------------------------------
Ran 2 tests in 0.000s

OK

注:在unittest2 assertAlmostEqual()中,首先测试两个对象是否相等,如果是,则结果为是,否则使用魔法(几乎相等),这就是为什么它有效。它也应该可以在新的python版本(2.7 >)中工作,因为它们中的大多数都实现了unittest2功能(我不确定这一点,因为我的工作站中没有Python2.7>)。

希望这能有所帮助:)

票数 5
EN

Stack Overflow用户

发布于 2011-03-21 19:31:53

Inf和任何有限值之间的差异不是Inf就是-Inf。这是IEEE754规范的一部分。由于assertAlmostEqual使用减法,这可以解释这种行为。

以下是英特尔x86 FSUB文档中的相关表:

为了解决你的问题,你需要Inf的特殊情况处理。

票数 4
EN

Stack Overflow用户

发布于 2011-03-21 19:27:46

我要说的是,-∞和-∞之间的区别可以和∞一样大。因此,它们并不是真正的“几乎相等”。

如果您想忽略这种特殊情况,那么下面这样的代码可能会很有用:

代码语言:javascript
复制
if valueA != valueB:
  self.assertAlmostEqual(valueA, valueB)
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5376853

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档