Почему сбой assertAlmostEqual (-inf, -inf)? - PullRequest
3 голосов
/ 21 марта 2011

Метод журнала Numpy дает -inf для log (0).Это значение сравнимо:

>>> np.log(0) == np.log(0)
True

Теперь при юнит-тестировании прекрасно работает следующее:

self.assertEqual(np.log(0),np.log(0))

, но это не удается:

self.assertAlmostEqual(np.log(0),np.log(0))

Почему такое поведение так?Это ошибка или предназначена?Если нужно, как я могу проверить, чтобы два значения с плавающей запятой были почти равными, также корректно работает для -inf?

Ответы [ 3 ]

5 голосов
/ 21 марта 2011

Из документа 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 (я не уверен в этом, потому что у меня нет python 2.7> на моей рабочей станции).

Надеюсь, это поможет :)

4 голосов
/ 21 марта 2011

Разница между Inf и любым конечным значением равна либо Inf, либо -Inf. Это часть спецификации IEEE754. Поскольку assertAlmostEqual использует вычитание, это объясняет поведение.

Вот соответствующая таблица из документации Intel x86 для FSUB:

enter image description here

Чтобы решить вашу проблему, вам понадобится специальная обработка для Inf.

3 голосов
/ 21 марта 2011

Я бы сказал, что разница между -∞ и -∞ может достигать ∞. Следовательно, они на самом деле не «почти равны».

Если вы хотите игнорировать этот особый случай, то может пригодиться что-то вроде этого:

if valueA != valueB:
  self.assertAlmostEqual(valueA, valueB)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...