2015-01-19 2 views
2

C++ 11 представил очень полезные математические функции в стандарте, такие как erf и erfc. Существуют упоминания о «гарантированном недоиспользовании» для ввода большего или меньшего, чем определенные значения, но я недостаточно знаю о представлении с плавающей точкой, чтобы четко понимать, что это означает с точки зрения точности.Какова точность std :: erf?

Если этот вопрос имеет смысл; какую точность (по порядку величины) можно ожидать от аппроксимации, реализуемой стандартной библиотекой (если она указана)?

+0

Не указано. Я полагаю, что соответствующая реализация на C++ позволяет говорить «42.0» при запросе на синус одного радиана. Однако на практике вы можете предположить, что двойная точность 'erf' точно округлена --- вы получите одно из двух чисел с плавающей запятой, наиболее близкое к erf числа, которое вы его накормили. – tmyklebu

+0

@tmyklebu Я хотел бы поверить вам, но предполагая, что я получу это число, означает, что стандартная реализация имеет как минимум 17 десятичных цифр. Я восхищаюсь и доверяю продавцам компиляторов C++, которые я использую (gcc и clang), но для меня это кажется необоснованным предположением, учитывая, что большинство приближений, которые я нашел, не превосходят 7 десятичных цифр. Не то, чтобы я жалуюсь; Я ожидаю, что это будет довольно грубое приближение, я просто хочу, чтобы я знал, насколько это грубо. – Sheljohn

+0

Вы не можете измерить точность такой функции в «цифрах», если она не очень плохая. Правильно до 17 цифр, но возврат «double» невозможно достичь даже для функции 'x/3'; рассмотрим ввод '29'. Нет «стандартной реализации» в смысле «стандартного C++», но одно в glibc верно округлено, и я ожидал бы, что Apple будет так же хорошо. Я не изучал 'erf' /' erfc' fdlibm, если он даже имеет их. – tmyklebu

ответ

2

Это зависит от качества реализации, которая зависит от поставщика компилятора (или библиотек времени выполнения, если они приобретаются отдельно). В лучшем случае точность будет соответствовать точности конкретного типа, который вы используете (двойной, длинный двойной и т. Д.).

Обратите внимание, что точность возвращаемого значения не связана с гарантированным потоком. Это просто принудительное постусловие, которое обеспечивает возвращаемое значение special underflow FP value, если вход находится за пределами ожидаемого домена.

+2

Я считаю это не очень приятным со стандартом, чтобы не гарантировать минимальную точность; это затрудняет использование этих функций для цифровой обработки. Но спасибо, это отвечает на мой вопрос :) – Sheljohn

+1

Да, это облегчило бы жизнь. Проблема в том, что для функций, которые зависят от тригонометрических операций, которых трудно достичь, поскольку чем выше точность, тем больше времени вычислений. Если у вас есть сопроцессор, который выполняет эти операции, ваша точность также зависит от его точности и т. Д. Так что действительно сложно достичь стандарта здесь, особенно для большого коммита, и еще труднее соответствовать ему. –

+2

@ Sh3ljohn: Хотя языковые стандарты не требуют какой-либо конкретной точности для определенных математических функций, поставщик библиотеки может предоставить информацию о максимальной ошибке реализации, которая указана как абсолютная ошибка, относительная ошибка или [ulp] (http://en.wikipedia.org/wiki/Unit_in_the_last_place), поэтому проверьте документацию. Надежные математические библиотеки обычно предоставляют результаты с несколькими (одноразрядными) ошибками ошибки для 'erf()' и 'erfc()'. – njuffa

Смежные вопросы