![]()  | 
![]() ![]() ![]() ![]()  | 
![]()  | 
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 ::
реклама  |