Рассматривая реализацию функции другого программиста для вычисления 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, как и везде?