Как выполнить unittest для выходов с плавающей запятой? - питон

предположим, я пишу модульный тест для функции, которая возвращает число с плавающей запятой, я могу сделать это как таковое с полной точностью в соответствии с моей машиной:

>>> import unittest
>>> def div(x,y): return x/float(y)
... 
>>>
>>> class Testdiv(unittest.TestCase):
...     def testdiv(self):
...             assert div(1,9) == 0.1111111111111111
... 
>>> unittest.main()
.
----------------------------------------------------------------------
Ran 1 test in 0.000s

OK

будет ли такая же полная точность с плавающей запятой одинаковой в OS/distro / machine?

я мог бы попытаться округлить и сделать модульный тест как таковой:

>>> class Testdiv(unittest.TestCase):
...     def testdiv(self):
...             assert round(div(1,9),4) == 0.1111
... 
>>>

Я также мог бы сделать assert с log(output) но чтобы сохранить десятичную точность, мне все равно нужно сделать округление или усечение.

а как иначе, если один pythonically бороться с unittesting для плавающей точки выхода?

2 ответов


точность float в Python зависит от базового представления C. От учебник/Арифметика с плавающей точкой: проблемы и ограничения, 15.1:

почти все машины сегодня (ноябрь 2000) используют плавающую точку IEEE-754 арифметика, и почти все платформы карта Python плавает в IEEE-754 "двойная точность."


Что касается тестирования, лучше использовать существующую функциональность, например TestCase.assertAmostEqual:

assertAlmostEqual (первый, второй, места=7, msg=нет, Дельта=нет)


на unittest.TestCase класс имеет определенные методы для сравнения поплавков:assertAlmostEqual и assertNotAlmostEqual. Чтобы процитировать документацию:

assertAlmostEqual(во-первых, во-вторых, мест=7, МСГ=нет, Дельта=нет) assertNotAlmostEqual(во-первых, во-вторых, мест=7, МСГ=нет, Дельта=нет)