Рассматривая реализацию функции другого программиста для вычисления CDF нормального распределения , я предложил либо заменить всю реализацию встроенными функциями Python, либо использовать SciPy, общую научную библиотеку.
Другой программист отметил, что ни math.erfc()
не scipy.stats.norm.cdf()
дает никаких точных гарантий в своей документации. Поэтому я должен быть более осторожным при замене алгоритма аппроксимации (который был взят из уважаемого источника , и который имел задокументированные границы ошибок ).
Честно говоря, мысль сомневаться в точности и точности встроенной или библиотечной функции никогда не приходила мне в голову. В конце концов, я вызываю такие функции, как sin()
и в sqrt()
течение многих лет, не задумываясь - почему math.erf()
или должно scipy.stats.norm.cdf()
быть иначе?
Но сейчас я обеспокоен. Мои вопросы:
- В общем, если в документации не упоминается особо, подразумевается ли, что эти виды функций полностью точны с точностью до последнего знака после запятой, в пределах точности, предлагаемой IEEE с плавающей запятой двойной точности?
- Это правда для Python
math.erf()
или SciPyscipy.stats.norm.cdf()
в частности? Как вы можете сказать? Эта страница руководства для
sin()
говорит ...Эти функции могут потерять точность, когда их аргумент близок к кратному пи или далек от 0.0.
Почему должны существовать такие предостережения, когда функция синуса периодическая и симметричная? Кажется, что на вызывающего абонента ложится бремя канонизации ввода для получения оптимальной точности.
С другой стороны, документация Mozilla
Math.sin()
ничего не говорит о точности или точности. Означает ли это, что он полностью точен, или это «общеизвестно», чтоMath.sin()
было бы точно только в определенных обстоятельствах в JavaScript, как и везде?
источник
Ответы:
Я бы не сделал это предположение.
Где я работаю, мы имеем дело с данными телеметрии, и общеизвестно, что две разные математические библиотеки могут давать два разных результата, даже если они обе соответствуют стандартам IEEE с плавающей запятой. Это имеет значение, когда вы пытаетесь повторить расчет и сравнить два результата на равенство.
Это справедливая оценка. Что делает это приемлемым, так это то, что в документации говорится об этом, чтобы не было никаких сюрпризов.
Я предлагаю вам попробовать несколько вычислений в каждой библиотеке или языке программирования (особенно вблизи граничных областей, например,
sin()
около несколькихpi
) и сравнить их. Это должно дать вам четкое представление о том, какое поведение вы можете ожидать от каждого из них.источник