Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
Разработка программного обеспечения

Error Function Inverses

Boost , Math Toolkit 2.5.0 , Error Functions

Boost C++ Libraries

...one of the most highly regarded and expertly designed C++ library projects in the world. Herb Sutter and Andrei Alexandrescu, C++ Coding Standards

PrevUpHomeNext
Synopsis
#include <boost/math/special_functions/erf.hpp>
namespace boost{ namespace math{
template <class T>
calculated-result-type erf_inv(T p);
template <class T, class Policy>
calculated-result-type erf_inv(T p, const Policy&);
template <class T>
calculated-result-type erfc_inv(T p);
template <class T, class Policy>
calculated-result-type erfc_inv(T p, const Policy&);
}} // namespaces

Тип возврата этих функций вычисляется с использованием правил расчета типа результата : тип возврата double, если T является целым типом, а T иначе.

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

Description
template <class T>
calculated-result-type erf_inv(T z);
template <class T, class Policy>
calculated-result-type erf_inv(T z, const Policy&);

Возвращает функцию обратной ошибки z, то есть значение x, такое, что:

p = erf(x);

template <class T>
calculated-result-type erfc_inv(T z);
template <class T, class Policy>
calculated-result-type erfc_inv(T z, const Policy&);

Возвращает обратное дополнение функции ошибки z, то есть значение x, такое, что:

p = erfc(x);

Accuracy

Для типов до 80-битных удваивает используемые приближения с точностью менее ~ 2 эпсилон. Для более высокоточных типов эти функции имеют ту же точность, что и функции передней ошибки .

Table 6.30. Error rates for erf_inv

Microsoft Visual C++ версия 12.0
Win32

GNU C++ версия 5.1.0
Linux
double

GNU C++ версия 5.1.0
Linux
длинный двойной

Компилятор Sun версии 0x5130
Солнечный солярис
длинный двойной

Inverse Erf Function

Max = 1.09ε (Mean = 0.502ε)

Max = 0ε (Mean = 0ε)

Max = 0.996ε (среднее значение = 0.389ε;)

Max = 0.996ε (Mean = 0.385ε)


Table 6.31. Error rates for erfc_inv

Microsoft Visual C++ версия 12.0
Win32

GNU C++ версия 5.1.0
Linux
double

GNU C++ версия 5.1.0
Linux
длинный двойной

Компилятор Sun версии 0x5130
Солнечный солярис
длинный двойной

Inverse Erfc Function

Макс = 1ε (Средний = 0,491ε);

Max = 0ε (Mean = 0ε)

Max = 0.996ε (Mean = 0.397ε)

Max = 0.996ε (Mean = 0.397ε)

Inverse Erfc Function: extreme values

Max = 1.62ε (Mean = 0.383ε)

Max = 1.62ε (Mean = 0.385ε)


Testing

Существует два набора тестов:

  • Основные проверки здравомыслия пытаются «объехать» от x до p и обратно. Эти тесты имеют довольно щедрые допуски: в целом как функции ошибок, так и их обратные изменения в некоторых местах меняются так быстро, что округление до более чем пары значительных цифр невозможно. Это особенно верно, когда p очень близок к одному: в этом случае на входе обратной функции недостаточно «информационного контента», чтобы вернуться туда, где вы начали.
  • Проверка точности с использованием высокоточных тестовых значений. Они измеряют точность результата, учитывая точные входные значения.
Implementation

Эти функции используют рациональное приближение , разработанное JM для вычисления начального приближения к результату, который является точным до ~10-19, то только если это имеет недостаточную точность по сравнению с эпсилоном для T, мы очищаем результат с помощью итерации Холли.

Построение рациональных приближений к функциям erf/erfc на самом деле удивительно сложно, особенно при высокой точности. По этой причине не было предпринято попыток достичь точности 10-34 , пригодной для использования с 128-битными реалами.

В следующем обсуждении p является значением, переданным erf_inv, а q является значением, переданным erfc_inv, так что p = 1 - q и q = 1 - p и в обоих случаях мы хотим решить для одного и того же результата x.

Для p <0.5 обратная эрф-функция достаточно гладкая и приближенная:

x = p(p + 10)(Y + R(p))

Дает хороший результат для постоянных Y и R(p), оптимизированных для низкой абсолютной ошибки по сравнению с |Y |.

Для q < 0,5 вещи становятся сложнее, через интервал 0,5 > q > 0,25 Хорошо работает следующее приближение:

x = sqrt(-2log(q)) / (Y + R(q))

В то время как для q < 0,25, пусть

z = sqrt(-log(q))

Затем результат дается:

x = z(Y + R(z - B))

Как и раньше, Y является константой, а рациональная функция R оптимизирована для низкой абсолютной ошибки по сравнению с |Y |. B также является константой: это наименьшее значение z, для которого каждое приближение является действительным. Существует несколько приближений этой формы, каждое из которых достигает немного дальше в хвост функции erfc (при точности long double расширенный диапазон экспонент по сравнению с double означает, что хвост действительно идет очень долгий путь).


PrevUpHomeNext

Статья Error Function Inverses раздела Math Toolkit 2.5.0 Error Functions может быть полезна для разработчиков на c++ и boost.




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.



:: Главная :: Error Functions ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-30 11:47:00
2025-05-20 07:42:44/0.0070528984069824/0