C++ 11 представил очень полезные математические функции в стандарте, такие как erf и erfc. Существуют упоминания о «гарантированном недоиспользовании» для ввода большего или меньшего, чем определенные значения, но я недостаточно знаю о представлении с плавающей точкой, чтобы четко понимать, что это означает с точки зрения точности.Какова точность std :: erf?
Если этот вопрос имеет смысл; какую точность (по порядку величины) можно ожидать от аппроксимации, реализуемой стандартной библиотекой (если она указана)?
Не указано. Я полагаю, что соответствующая реализация на C++ позволяет говорить «42.0» при запросе на синус одного радиана. Однако на практике вы можете предположить, что двойная точность 'erf' точно округлена --- вы получите одно из двух чисел с плавающей запятой, наиболее близкое к erf числа, которое вы его накормили. – tmyklebu
@tmyklebu Я хотел бы поверить вам, но предполагая, что я получу это число, означает, что стандартная реализация имеет как минимум 17 десятичных цифр. Я восхищаюсь и доверяю продавцам компиляторов C++, которые я использую (gcc и clang), но для меня это кажется необоснованным предположением, учитывая, что большинство приближений, которые я нашел, не превосходят 7 десятичных цифр. Не то, чтобы я жалуюсь; Я ожидаю, что это будет довольно грубое приближение, я просто хочу, чтобы я знал, насколько это грубо. – Sheljohn
Вы не можете измерить точность такой функции в «цифрах», если она не очень плохая. Правильно до 17 цифр, но возврат «double» невозможно достичь даже для функции 'x/3'; рассмотрим ввод '29'. Нет «стандартной реализации» в смысле «стандартного C++», но одно в glibc верно округлено, и я ожидал бы, что Apple будет так же хорошо. Я не изучал 'erf' /' erfc' fdlibm, если он даже имеет их. – tmyklebu