Меня попросили проверить библиотеку, предоставленную третьей стороной. Известно, что библиотека является точной и значимой. Любые менее значимые ошибки можно смело игнорировать. Я хочу написать функцию, которая поможет мне сравнить результаты:
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 всегда будут одного типа. Очень важно, чтобы преобразование не вводило дополнительную ошибку в функцию.
- Позволяет сохранить это числовое значение, поэтому функции, которые преобразуются в строки или используют не математические трюки, не идеальны. Эта программа будет проверена кем-то, кто математик, который захочет доказать, что функция выполняет то, что она должна делать.
- Скорость... Мне нужно сравнить множество чисел, чтобы чем быстрее, тем лучше.
- У меня есть numpy, scipy и стандартная библиотека. Что-нибудь еще будет трудно для меня, особенно для такой небольшой части проекта.