![]() |
![]() ![]() ![]() ![]() ![]() |
![]() |
Log GammaBoost , Math Toolkit 2.5.0 , Gamma Functions
|
Microsoft Visual C++ версия 12.0 |
GNU C++ версия 5.1.0 |
GNU C++ версия 5.1.0 |
Солнечный компилятор версии 0x5130 |
|
---|---|---|---|---|
факториалы |
Макс = 0.914ε (Средний = 0,167ε) |
Макс = 0ε (Mean = 0ε) |
Max = 0.991ε (Mean = 0.311ε) |
Макс = 0.991ε (Средний = 0.383ε) |
около 0 |
Макс = 0.964ε (Средний = 0.462ε) |
Макс = 0ε (Mean = 0ε) |
Макс = 1.42ε (Mean = 0.566ε) |
Макс = 1,42ε (Средний = 0,566ε) |
Около 1 |
Макс = 0.867ε (Средний = 0.468ε) |
Max = 0ε (Mean = 0ε) |
Макс = 0.948ε (Mean = 0.36ε) |
Макс = 0,866ε (Средний = 0,355ε) |
около 2 |
Max = 0,591ε (Mean = 0,159ε) |
Макс = 0ε (Средний = 0ε) |
Макс = 0.878ε (Mean = 0.242ε) |
Макс = 0.878ε (Средний = 0.241ε) |
около -10 |
Макс = 4.22ε (Mean = 1.33ε) |
Макс = 0ε (Mean = 0ε) |
Max = 3.81ε (Mean = 1.01ε) |
Max = 3.81ε (Mean = 1.01ε) |
около -55 |
Макс = 0.821ε (Средний = 0.419ε) |
Макс = 0ε (Mean = 0ε) |
Макс = 0.821ε (Mean = 0,513ε) |
Макс = 1.59ε (Средний = 0,587ε) |
Основные тесты для этой функции включают сравнение с журналами факториалов, которые могут быть независимо рассчитаны с очень высокой точностью.
Также используются случайные тесты в ключевых проблемных областях.
Общая версия этой функции реализована с использованием приближения Стерлинга для больших аргументов:
Для небольших аргументов используется логарифм тгаммы.
Для отрицательногоzиспользуется логарифмический вариант формулы отражения:
Для типов известной точности используется аппроксимацияЛанчоса, класс признаков<boost::math::lanczos::lanczos_traits
>отображает тип Т в соответствующее приближение. Логарифмическая версия приближения Ланчоса:
Где Le,g& #160; это сумма Ланчоса, масштабированная на eg.
Как и раньше, формула отражения используется дляz< 0.
Когда z очень близко к 1 или 2, тогда логарифмическая версияПриближение Ланчосаочень сильно страдает от ошибки отмены: действительно, для значений, достаточно близких к 1 или 2, могут быть получены произвольно большие относительные ошибки (хотя абсолютная ошибка крошечная).
Для типов с точностью до 113 бит (до и включая 128-битные длинные двойники) используются корнесохраняющие рациональные приближения, разработанные JM, через интервалы [1,2] и [2,3]. В интервале [2,3] используется форма приближения:
lgamma(z) = (z-2)(z+1)(Y + R(z-2));
Где Y является константой, а R(z-2) является рациональным приближением: оптимизировано так, что абсолютная ошибка крошечна по сравнению с Y. Кроме того, малые значения z, превышающие 3, могут быть обработаны путем уменьшения аргумента с использованием отношения повторения:
lgamma(z+1) = log(z) + lgamma(z);
В интервале [1,2] необходимо использовать два приближения, одно для малых z использует:
lgamma(z) = (z-1)(z-2)(Y + R(z-1));
Опять же, Y является константой, а R(z-1) оптимизирован для низкой абсолютной ошибки по сравнению с Y. Для z >1.5 вышеприведенная форма не сходится с решением minimax, но эта аналогичная форма:
lgamma(z) = (2-z)(1-z)(Y + R(2-z));
Наконец, для z< 1 отношение повторения может быть использовано для перехода к z >1:
lgamma(z) = lgamma(z+1) - log(z);
Обратите внимание, что, хотя это включает вычитание, оно, по-видимому, не страдает от ошибки отмены: по мере уменьшения z с 1 термин<-log(z)
>становится положительным гораздо быстрее, чем термин<lgamma(z+1)
>становится отрицательным. Так что в данном конкретном случае значительные цифры сохраняются, а не отменяются.
Для других типов, которые имеют приближениеLanczos, определенное для них, текущее решение выглядит следующим образом: представьте, что мы уравновешиваем два термина в приближенииLanczos, разделяя термин мощности на его значение приz = 1, а затем умножаем коэффициенты Lanczos на то же значение. Теперь каждый термин будет принимать значение 1 вz = 1, и мы можем переставить условия мощности в термины log1p. Аналогично, если вычесть 1 из части суммы Ланчоса (алгебраически, вычитая значение каждого термина приz = 1), мы получим новое суммирование, которое также можно подавать в log1p. Важно отметить, что все термины имеют тенденцию к нулю, какz - >1:
Ck& #160; термины, приведенные выше, такие же, как и в приближении Ланчоса.
Аналогичная перегруппировка может быть выполнена приz = 2:
Статья Log Gamma раздела Math Toolkit 2.5.0 Gamma Functions может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.
:: Главная :: Gamma Functions ::
реклама |