Как выполнить 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, МСГ=нет, Дельта=нет)