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

Error Functions

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(T z);
template <class T, class Policy>
calculated-result-type erf(T z, const Policy&);
template <class T>
calculated-result-type erfc(T z);
template <class T, class Policy>
calculated-result-type erfc(T z, const Policy&);
}} // namespaces

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

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

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

Возвращаетфункцию ошибкиerfz:

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

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

Accuracy

В следующей таблице показаны пиковые ошибки (в единицах эпсилона), обнаруженные на различных платформах с различными типами плавающих точек, наряду с сравнениями с библиотекамиGSL-1.9,GNU C Lib,HP-UX C LibraryиCephes. Если не указано иное, любой тип плавающей точки, который является более узким, чем показанный, будет иметьфактически нулевую ошибку.

Table 6.28. Error rates for erf

Microsoft Visual C++ версия 12.0
Win32
двойная

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

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

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

Функция Эрфа: малые значения

Макс = 0,96ε (Средний = 0,182ε)

:Макс = 1,57ε (Средний = 0,317ε)]

Max = 0.925ε (Mean = 0,193ε)

:Max = 0.944ε (Mean = 0,191ε)]
:Max = 0.944ε (Mean = 0,191ε)]

Макс = 0.841ε (Средний = 0,0687ε)

GSL 1.16:Макс = 2.06ε (Средний = 0.319ε)]
Цефес:Макс = 1.13ε (Средний = 0.442ε)]

Макс = 0.925ε (Средний = 0,193ε)

:Макс = 0.944ε (Средний = 0,194ε)]

Функция Эрфа: средние значения

Max = 1ε (Mean = 0,169ε)

:Max = 1.19ε (Mean = 0.244ε)]

Макс = 1,5ε (Mean = 0,193ε)

:Макс = 0,921ε (Mean = 0,0723ε)]
:Макс = 0,921ε (Mean = 0,0723ε)]

Макс = 1ε (Mean = 0,119ε)
GSL 1.16:Макс = 2.31ε (Mean = 0,368ε)]
Цефес:Макс = 1,34ε (Mean = 0,279ε)]

Макс = 1.5ε (Средний = 0.202ε)

:Макс = 0.921ε (Средний = 0,071ε)]

Функция Эрфа: Большие значения

Макс = 0ε (Mean = 0ε)

:Макс = 0ε (Mean = 0ε)]

Макс = 0ε (Mean = 0ε)
:Макс = 0ε (Mean = 0ε)]
:Макс = 0ε (Mean = 0ε)]

Макс = 0ε (Mean = 0ε)

GSL 1.16:Макс = 0ε (Mean = 0ε)]
Цефес:Макс = 0ε (Mean = 0ε)]

Макс = 0ε (Mean = 0ε)

:Макс = 0ε (Mean = 0ε)]


Table 6.29. Error rates for erfc

Microsoft Visual C++ версия 12.0
Win32
двойная

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

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

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

Функция Эрфа: малые значения

Макс = 0ε (Mean = 0ε)

:Макс = 0ε (Mean = 0ε)]

Макс = 0ε (Mean = 0ε)
:Макс = 0ε (Mean = 0ε)]
:Макс = 0ε (Mean = 0ε)]

Макс = 0.658ε (Средний = 0,0537ε)

GSL 1.16:Макс = 1,01ε (Средний = 0.485ε)]
Цефес:Макс = 0.786ε (Средний = 0,0642ε)

Макс = 0ε (Mean = 0ε)

:Макс = 0ε (Mean = 0ε)]

Функция Эрфа: средние значения

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

:Макс = 2,36ε (Средний = 0,539ε)]

Макс = 1,76ε (Mean = 0,365ε)

:Макс = 1,35ε (Mean = 0,307ε)]
:Макс = 1,35ε (Mean = 0,307ε)

Макс = 0.983ε (Средний = 0.213ε)

GSL 1.16:Макс = 2.64ε (Средний = 0.662ε)]
Цефес:Макс = 3.59ε (Средний = 0.779ε)]

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

:Макс = 2,81ε (Средний = 0,739ε)]

Функция Эрфа: Большие значения

Max = 1.14ε (Mean = 0.248ε)

:Max = 1,84ε (Mean = 0.331ε)]

Макс = 1,57ε (Mean = 0,542ε)

:Макс = 1.26ε (Mean = 0.441ε)]
:Макс = 1.26ε (Mean = 0.441ε)]

Макс = 0.868ε (Средний = 0,147ε)

GSL 1.16:Макс = 3.9ε (Средний = 0.472ε)]
Цефес:Макс = 2.74ε (Средний = 0.413ε)

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

:Макс = 4.91ε (Средний = 1,54ε)]


Testing

Тесты для этих функций состоят из двух частей: базовые проверки здравомыслия используют точечные значения, рассчитанные с использованиемонлайн-оценщика Mathworld, в то время как проверки точности используют высокоточные тестовые значения, рассчитанные с точностью 1000 бит сNTL::RRи этой реализацией. Обратите внимание, что общие и типоспецифические версии этих функций используют различные реализации внутри, поэтому это дает нам достаточно независимые данные тестирования. Использование наших тестовых данных для тестирования других «известных хороших» реализаций также обеспечивает дополнительную проверку здравомыслия.

Implementation

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

erf(-z) = 1 - erf(z);
erfc(-z) = 2 - erfc(z);  // preferred when -z < -0.5
erfc(-z) = 1 + erf(z);   // preferred when -0.5 <= -z < 0

Общие версии этих функций реализуются с точки зрения неполной гамма-функции.

При распознавании значимого (mantissa) размера (в настоящее время для 53, 64 и 113-битных реалов, плюс одноточная 24-битная обработка с помощью продвижения в два раза) используется ряд рациональных приближений, разработанных JM.

Дляz<=0,5затем используется рациональное приближение к эрфу, основанное на наблюдении, что эрф является нечетной функцией и поэтому эрф вычисляется с использованием:

erf(z) = z * (C + R(z*z));

где рациональное приближение R(z*z) оптимизировано для абсолютной ошибки: если его абсолютная ошибка достаточно мала по сравнению с константой C, то любая ошибка округления, возникающая во время вычисления R(z*z), фактически исчезнет из результата. В результате ошибка для erf и erfc в этом регионе очень низкая: последний бит неверен только в очень небольшом количестве случаев.

Дляz>0,5мы наблюдаем, что через небольшой интервал [a, b]:

erfc(z) * exp(z*z) * z ~ c

Для некоторых постоянных с.

Поэтому дляz>0,5мы вычисляем erfc, используя:

erfc(z) = exp(-z*z) * (C + R(z - B)) / z;

Опять же, R(z - B) оптимизирован для абсолютной ошибки, и константаCявляется средней величинойerfcz]expz*zz, взятой в конечных точках диапазона. Опять же, если абсолютная ошибка в R(z - B) мала по сравнению сc, тоc+Rz-Bбудет правильно округлена, и ошибка в результате будет зависеть только от точности функции exp. На практике во всех случаях, кроме очень небольшого числа, ошибка ограничивается последней частью результата. КонстантаВвыбрана так, что левый конец диапазона рационального приближения равен 0.

Для большихzв диапазоне [a, +∞] приведенное выше приближение изменено на:

erfc(z) = exp(-z*z) * (C + R(1 / z)) / z;

PrevUpHomeNext

Статья Error Functions раздела 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 01:26:32/0.0051479339599609/0