Подразумеваемая точность функций с плавающей точкой

9

Рассматривая реализацию функции другого программиста для вычисления CDF нормального распределения , я предложил либо заменить всю реализацию встроенными функциями Python, либо использовать SciPy, общую научную библиотеку.

Другой программист отметил, что ни math.erfc()не scipy.stats.norm.cdf()дает никаких точных гарантий в своей документации. Поэтому я должен быть более осторожным при замене алгоритма аппроксимации (который был взят из уважаемого источника , и который имел задокументированные границы ошибок ).

Честно говоря, мысль сомневаться в точности и точности встроенной или библиотечной функции никогда не приходила мне в голову. В конце концов, я вызываю такие функции, как sin()и в sqrt()течение многих лет, не задумываясь - почему math.erf()или должно scipy.stats.norm.cdf()быть иначе?

Но сейчас я обеспокоен. Мои вопросы:

  1. В общем, если в документации не упоминается особо, подразумевается ли, что эти виды функций полностью точны с точностью до последнего знака после запятой, в пределах точности, предлагаемой IEEE с плавающей запятой двойной точности?
  2. Это правда для Python math.erf()или SciPy scipy.stats.norm.cdf()в частности? Как вы можете сказать?
  3. Эта страница руководства дляsin() говорит ...

    Эти функции могут потерять точность, когда их аргумент близок к кратному пи или далек от 0.0.

    Почему должны существовать такие предостережения, когда функция синуса периодическая и симметричная? Кажется, что на вызывающего абонента ложится бремя канонизации ввода для получения оптимальной точности.

    С другой стороны, документация Mozilla Math.sin()ничего не говорит о точности или точности. Означает ли это, что он полностью точен, или это «общеизвестно», что Math.sin()было бы точно только в определенных обстоятельствах в JavaScript, как и везде?

200_success
источник
1
К сведению, что касается вопроса 1. Обычно гарантии точности даются в терминах ULP (единицы измерения на последнем месте), которые относятся к двоичным разрядам числа с плавающей запятой.

Ответы:

10

Если в документации не упоминается особо, подразумевается ли, что эти виды функций полностью точны с точностью до последнего знака после запятой, в пределах точности, предлагаемой IEEE с плавающей запятой двойной точности?

Я бы не сделал это предположение.

Где я работаю, мы имеем дело с данными телеметрии, и общеизвестно, что две разные математические библиотеки могут давать два разных результата, даже если они обе соответствуют стандартам IEEE с плавающей запятой. Это имеет значение, когда вы пытаетесь повторить расчет и сравнить два результата на равенство.

Кажется, что на вызывающего абонента ложится бремя канонизации ввода для получения оптимальной точности.

Это справедливая оценка. Что делает это приемлемым, так это то, что в документации говорится об этом, чтобы не было никаких сюрпризов.

С другой стороны, документация Mozilla ...

Я предлагаю вам попробовать несколько вычислений в каждой библиотеке или языке программирования (особенно вблизи граничных областей, например, sin()около нескольких pi) и сравнить их. Это должно дать вам четкое представление о том, какое поведение вы можете ожидать от каждого из них.

Роберт Харви
источник
2
Тест это хорошая идея. В бесчисленных случаях документация говорит об одном, но функции ведут себя по-другому. И ОП хотят полагаться на неявные предположения, которые даже не документированы.
Сиюань Рен