![]() |
![]() ![]() ![]() ![]() ![]() |
![]() |
Exponential Integral EiBoost , Math Toolkit 2.5.0 , Exponential Integrals
|
Microsoft Visual C++ версия 12.0 |
GNU C++ версия 5.1.0 |
GNU C++ версия 5.1.0 |
Солнечный компилятор версии 0x5130 |
|
---|---|---|---|---|
Exponential Integral Ei |
Max = 1.43ε (Mean = 0.541ε) |
Max = 5.05ε (Mean = 0.821ε) |
Max = 0.994ε (Mean = 0.142ε) |
Max = 3.34ε (Mean = 0.631ε) |
Exponential Integral Ei: double exponent range |
Max = 1.7ε (Mean = 0.66ε) |
Max = 1.72ε (Mean = 0.593ε) |
Max = 0.998ε (Mean = 0.156ε) |
Max = 1.72ε (Mean = 0.618ε) |
Exponential Integral Ei: long exponent range |
Max = 1.98ε (Mean = 0.595ε) |
Max = 1.98ε (Mean = 0.575ε) |
Следует отметить, что все три библиотеки, протестированные выше, обеспечивают субэпсилоновую точность по большей части своего диапазона.
GSL имеет наибольшую трудность вблизи положительного корня En, в то время как SPECFUN Cody вместе с этой реализацией значительно увеличивает их частоту ошибок в диапазоне [4,6].
Тесты для этих функций состоят из двух частей: базовые проверки здравомыслия используют точечные значения, рассчитанные с использованиемонлайн-оценщика Mathworld, в то время как проверки точности используют высокоточные тестовые значения, рассчитанные с точностью 1000 бит сNTL::RRи этой реализацией. Обратите внимание, что общие и типоспецифические версии этих функций используют различные реализации внутри, поэтому это дает нам достаточно независимые данные тестирования. Использование наших тестовых данных для тестирования других «известных хороших» реализаций также обеспечивает дополнительную проверку здравомыслия.
Для x<0 эта функция просто вызываетzeta(1, -x): которая, в свою очередь, реализуется с точки зрения рациональных приближений, когда тип x имеет 113 или меньше бит точности.
Для x >0 общая версия реализована с использованием бесконечной серии:
Однако, когда точность типа аргумента известна во время компиляции и составляет 113 бит или меньше, то используются рациональные приближения, разработанные JM.
Для 0< z< 6 корнесохраняющее приближение формы:
используется, где z0является положительным корнем функции, а R(z/3 - 1) представляет собой минимаксное рациональное приближение, ремасштабируемое таким образом, что оно оценивается выше [-1,1]. Обратите внимание, что в то время как рациональное приближение к [0,6] быстро сходится к минимаксному решению, на практике оно довольно плохо обусловливается. Коди и Тахериспытали ту же проблему и преобразовали полиномы в форму Чебешева, чтобы обеспечить стабильные вычисления. Экспериментом мы обнаружили, что полиномы столь же устойчивы в полиноме, как и чебышевская формапри условии, что они вычисляются через интервал [-1,1].
На протяжении ряда интервалов [a,b] и [b,INF] рациональное приближение принимает форму:
гдеcявляется константой, а R(t) является минимаксным решением, оптимизированным для низкой абсолютной ошибки по сравнению сc. Переменнаяtявляется<1/z
>, когда диапазон в бесконечности и<2z/(b-a)-(2a/(b-a)+1)
>иначе: это имеет эффект масштабирования z до интервала [-1,1]. Как и прежде, рациональные приближения через произвольные интервалы были признаны необусловленными: Коди и Тэчер решили эту проблему, превратив полиномы в их эквивалент J-фракции. Однако до тех пор, пока интервал оценки был [-1,1] и количество тщательно подобранных терминов, было обнаружено, что полиномымогут быть оценены с подходящей точностью: частота ошибок обычно составляет от 2 до 3 эпсилон, что сопоставимо с частотой ошибок, которую Коди и Тахер достигли с помощью J-фракций, но незначительно более эффективно, учитывая, что задействовано меньшее количество делений.
Статья Exponential Integral Ei раздела Math Toolkit 2.5.0 Exponential Integrals может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.
:: Главная :: Exponential Integrals ::
реклама |