Меня попросили проверить библиотеку, предоставленную третьей стороной. Библиотека известна с точностью до n значимых цифр. Любые менее значимые ошибки можно смело игнорировать. Я хочу написать функцию, которая поможет мне сравнить результаты:
def nearlyequal( a, b, sigfig=5 ):
Цель этой функции - определить, приблизительно ли два числа с плавающей точкой (a и b) приблизительно равны. Функция вернет True, если a == b (точное совпадение) или a и b имеют одинаковое значение при округлении до sigfig значащих цифр при записи в десятичном виде.
Кто-нибудь может предложить хорошую реализацию? Я написал мини-юнит-тест. Если вы не видите ошибку в моих тестах, то хорошая реализация должна пройти следующее:
assert nearlyequal(1, 1, 5)
assert nearlyequal(1.0, 1.0, 5)
assert nearlyequal(1.0, 1.0, 5)
assert nearlyequal(-1e-9, 1e-9, 5)
assert nearlyequal(1e9, 1e9 + 1 , 5)
assert not nearlyequal( 1e4, 1e4 + 1, 5)
assert nearlyequal( 0.0, 1e-15, 5 )
assert not nearlyequal( 0.0, 1e-4, 6 )
Дополнительные примечания:
- Значения a и b могут иметь тип int, float или numpy.float64. Значения a и b всегда будут одного типа. Важно, чтобы преобразование не вносило дополнительную ошибку в функцию.
- Позволяет сохранить это число, поэтому функции, которые преобразуются в строки или используют нематематические приемы, не идеальны. Эта программа будет проверена кем-то, кто является математиком, который захочет доказать, что функция выполняет то, что должна.
- Скорость ... Я должен сравнить множество чисел, поэтому чем быстрее, тем лучше.
- У меня есть тупица, сципи и стандартная библиотека. Мне будет трудно получить что-то еще, особенно для такой маленькой части проекта.