![]() |
![]() ![]() ![]() ![]() ![]() |
![]() |
Error FunctionsBoost , Math Toolkit 2.5.0 , Error Functions
|
Microsoft Visual C++ версия 12.0 |
GNU C++ версия 5.1.0 |
GNU C++ версия 5.1.0 |
Солнечный компилятор версии 0x5130 |
|
---|---|---|---|---|
Функция Эрфа: малые значения |
Макс = 0,96ε (Средний = 0,182ε) |
Max = 0.925ε (Mean = 0,193ε) |
Макс = 0.841ε (Средний = 0,0687ε) |
Макс = 0.925ε (Средний = 0,193ε) |
Функция Эрфа: средние значения |
Max = 1ε (Mean = 0,169ε) |
Макс = 1,5ε (Mean = 0,193ε) |
Макс = 1ε (Mean = 0,119ε) |
Макс = 1.5ε (Средний = 0.202ε) |
Функция Эрфа: Большие значения |
Макс = 0ε (Mean = 0ε) |
Макс = 0ε (Mean = 0ε) |
Макс = 0ε (Mean = 0ε) |
Макс = 0ε (Mean = 0ε) |
Table 6.29. Error rates for erfc
Microsoft Visual C++ версия 12.0 |
GNU C++ версия 5.1.0 |
GNU C++ версия 5.1.0 |
Солнечный компилятор версии 0x5130 |
|
---|---|---|---|---|
Функция Эрфа: малые значения |
Макс = 0ε (Mean = 0ε) |
Макс = 0ε (Mean = 0ε) |
Макс = 0.658ε (Средний = 0,0537ε) |
Макс = 0ε (Mean = 0ε) |
Функция Эрфа: средние значения |
Макс = 1,65ε (Средний = 0,373ε) |
Макс = 1,76ε (Mean = 0,365ε) |
Макс = 0.983ε (Средний = 0.213ε) |
Макс = 1,76ε (Средний = 0,383ε) |
Функция Эрфа: Большие значения |
Max = 1.14ε (Mean = 0.248ε) |
Макс = 1,57ε (Mean = 0,542ε) |
Макс = 0.868ε (Средний = 0,147ε) |
Макс = 1,57ε (Средний = 0,564ε) |
Тесты для этих функций состоят из двух частей: базовые проверки здравомыслия используют точечные значения, рассчитанные с использованиемонлайн-оценщика Mathworld, в то время как проверки точности используют высокоточные тестовые значения, рассчитанные с точностью 1000 бит сNTL::RRи этой реализацией. Обратите внимание, что общие и типоспецифические версии этих функций используют различные реализации внутри, поэтому это дает нам достаточно независимые данные тестирования. Использование наших тестовых данных для тестирования других «известных хороших» реализаций также обеспечивает дополнительную проверку здравомыслия.
Все версии этих функций сначала используют обычные формулы отражения, чтобы сделать свои аргументы положительными:
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;
Статья Error Functions раздела Math Toolkit 2.5.0 Error Functions может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.
:: Главная :: Error Functions ::
реклама |