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

Log Gamma

Boost , Math Toolkit 2.5.0 , Gamma 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/gamma.hpp>
namespace boost{ namespace math{
template <class T>
calculated-result-type lgamma(T z);
template <class T, class Policy>
calculated-result-type lgamma(T z, const Policy&);
template <class T>
calculated-result-type lgamma(T z, int* sign);
template <class T, class Policy>
calculated-result-type lgamma(T z, int* sign, const Policy&);
}} // namespaces
Description

Функцияlgammaопределяется:

Вторая форма функции принимает указатель на целое число, которое, если ненулевая, устанавливается на выходе на знак tgamma(z).

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

Эффективно существует две версии этой функции: полностью общая версия, которая является медленной, но достаточно точной, и гораздо более эффективное приближение, которое используется там, где число цифр в значении T соответствует определенному приближениюЛанчоса. На практике любой встроенный тип плавающей точки, с которым вы столкнетесь, имеет подходящее значение.Приближение Ланчосаопределено для него. Также возможно, учитывая достаточное машинное время, генерировать дальнейшее приближениеLanczosс использованием программы libs/math/tools/lanczos_generator.cpp.

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

Accuracy

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

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

Table 6.3. Error rates for lgamma

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

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

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

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

факториалы

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

:Макс = 0.958ε (Средний = 0.38ε)]

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

GSL 1.16:Макс = 33.6ε (Mean = 2.78ε)]
Rmath 3.0.2:Макс = 1,55ε (Mean = 0,592ε)]
Цефес:Макс = 1,55ε (Mean = 0,512ε)]

Max = 0.991ε (Mean = 0.311ε)

:Max = 1,67ε (Mean = 0.487ε)]
:Max = 1,67ε (Mean = 0.487ε)]

Макс = 0.991ε (Средний = 0.383ε)

:Макс = 1.36ε (Средний = 0.476ε)]

около 0

Макс = 0.964ε (Средний = 0.462ε)

:Макс = 0.962ε (Средний = 0.372ε)]

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

GSL 1.16:Макс = 5.21ε (Mean = 1,57ε)]
Rmath 3.0.2:Макс = 0ε (Mean = 0ε)]
Цефес:Макс = 1,16ε (Mean = 0,341ε]]

Макс = 1.42ε (Mean = 0.566ε)
:Макс = 0.964ε (Mean = 0.543ε)]
:Макс = 0.964ε (Mean = 0.543ε)]

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

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

Около 1

Макс = 0.867ε (Средний = 0.468ε)

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

Max = 0ε (Mean = 0ε)
GSL 1.16:Max = 442ε (Mean = 88.8ε)]
Rmath 3.0.2:Max = 7.99e+04ε (Mean = 1.68e+04ε)]
Cephes:Max = 1.14e+05ε (Mean = 2.64e+04ε)

Макс = 0.948ε (Mean = 0.36ε)

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

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

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

около 2

Max = 0,591ε (Mean = 0,159ε)

:Max = 0,741ε (Mean = 0,473ε)]

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

GSL 1.16:Макс = 1.17e+03ε (Средний = 274ε)]
(Rmath 3.0.2:Макс = 2.63e+05ε)
Цефес:Макс = 5.08e+05ε (Средний = 9.04e+04ε]]

Макс = 0.878ε (Mean = 0.242ε)

:Макс = 0.741ε (Mean = 0.263ε)]
:Макс = 0.741ε (Mean = 0.263ε)]

Макс = 0.878ε (Средний = 0.241ε)

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

около -10

Макс = 4.22ε (Mean = 1.33ε)

:Макс = 0.997ε (Mean = 0.444ε)]

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

GSL 1.16:Макс = 24.9ε (Mean = 4.6ε)]
Rmath 3.0.2:Макс = 2.41e+05ε (Mean = 4.29e+04ε)]
Цефес:Макс = 0.997ε (Mean = 0.429ε)

Max = 3.81ε (Mean = 1.01ε)

:Max = 3.01ε (Mean = 0.86ε)]
:Max = 3.01ε (Mean = 0.86ε)

Max = 3.81ε (Mean = 1.01ε)

:Max = 3.04ε (Mean = 1.01ε)]

около -55

Макс = 0.821ε (Средний = 0.419ε)

:Макс = 249ε (Средний = 43.1ε)]

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

GSL 1.16:Макс = 7.02ε (Mean = 1.47ε)]
Rmath 3.0.2:Макс = 4.08e+04ε (Mean = 7.26e+03ε)]
Цефес:Макс = 1.64ε (Mean = 0.693ε)

Макс = 0.821ε (Mean = 0,513ε)
:Макс = 1,58ε (Mean = 0.672ε)]
:Макс = 1,58ε (Mean = 0.672ε)]

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

:Макс = 0.821ε (Средний = 0.674ε)]


Testing

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

Также используются случайные тесты в ключевых проблемных областях.

Implementation

Общая версия этой функции реализована с использованием приближения Стерлинга для больших аргументов:

Для небольших аргументов используется логарифм тгаммы.

Для отрицательного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:


PrevUpHomeNext

Статья Log Gamma раздела Math Toolkit 2.5.0 Gamma Functions может быть полезна для разработчиков на c++ и boost.




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.



:: Главная :: Gamma Functions ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-30 11:47:00
2025-07-05 06:13:53/0.0057251453399658/0