115 lines
3.5 KiB
Plaintext
115 lines
3.5 KiB
Plaintext
[section:gamma_ratios Ratios of Gamma Functions]
|
|
|
|
``
|
|
#include <boost/math/special_functions/gamma.hpp>
|
|
``
|
|
|
|
namespace boost{ namespace math{
|
|
|
|
template <class T1, class T2>
|
|
``__sf_result`` tgamma_ratio(T1 a, T2 b);
|
|
|
|
template <class T1, class T2, class ``__Policy``>
|
|
``__sf_result`` tgamma_ratio(T1 a, T2 b, const ``__Policy``&);
|
|
|
|
template <class T1, class T2>
|
|
``__sf_result`` tgamma_delta_ratio(T1 a, T2 delta);
|
|
|
|
template <class T1, class T2, class Policy>
|
|
``__sf_result`` tgamma_delta_ratio(T1 a, T2 delta, const ``__Policy``&);
|
|
|
|
}} // namespaces
|
|
|
|
[h4 Description]
|
|
|
|
template <class T1, class T2>
|
|
``__sf_result`` tgamma_ratio(T1 a, T2 b);
|
|
|
|
template <class T1, class T2, class ``__Policy``>
|
|
``__sf_result`` tgamma_ratio(T1 a, T2 b, const ``__Policy``&);
|
|
|
|
Returns the ratio of gamma functions:
|
|
|
|
[equation gamma_ratio0]
|
|
|
|
[optional_policy]
|
|
|
|
Internally this just calls `tgamma_delta_ratio(a, b-a)`.
|
|
|
|
template <class T1, class T2>
|
|
``__sf_result`` tgamma_delta_ratio(T1 a, T2 delta);
|
|
|
|
template <class T1, class T2, class ``__Policy``>
|
|
``__sf_result`` tgamma_delta_ratio(T1 a, T2 delta, const ``__Policy``&);
|
|
|
|
Returns the ratio of gamma functions:
|
|
|
|
[equation gamma_ratio1]
|
|
|
|
[optional_policy]
|
|
|
|
Note that the result is calculated accurately even when /delta/ is
|
|
small compared to /a/: indeed even if /a+delta ~ a/. The function is
|
|
typically used when /a/ is large and /delta/ is very small.
|
|
|
|
The return type of these functions is computed using the __arg_pomotion_rules
|
|
when T1 and T2 are different types, otherwise the result type is simple T1.
|
|
|
|
[graph tgamma_delta_ratio]
|
|
|
|
[h4 Accuracy]
|
|
|
|
The following table shows the peak errors (in units of epsilon)
|
|
found on various platforms with various floating point types.
|
|
Unless otherwise specified any floating point type that is narrower
|
|
than the one shown will have __zero_error.
|
|
|
|
[table Errors In the Function tgamma_delta_ratio(a, delta)
|
|
[[Significand Size] [Platform and Compiler] [20 < a < 80
|
|
|
|
and
|
|
|
|
delta < 1]]
|
|
[[53] [Win32, Visual C++ 8] [Peak=16.9 Mean=1.7] ]
|
|
[[64] [Redhat Linux IA32, gcc-3.4.4] [Peak=24 Mean=2.7]]
|
|
[[64] [Redhat Linux IA64, gcc-3.4.4] [Peak=12.8 Mean=1.8]]
|
|
[[113] [HPUX IA64, aCC A.06.06] [Peak=21.4 Mean=2.3] ]
|
|
]
|
|
|
|
[table Errors In the Function tgamma_ratio(a, b)
|
|
[[Significand Size] [Platform and Compiler] [6 < a,b < 50]]
|
|
[[53] [Win32, Visual C++ 8] [Peak=34 Mean=9] ]
|
|
[[64] [Redhat Linux IA32, gcc-3.4.4] [Peak=91 Mean=23]]
|
|
[[64] [Redhat Linux IA64, gcc-3.4.4] [Peak=35.6 Mean=9.3]]
|
|
[[113] [HPUX IA64, aCC A.06.06] [Peak=43.9 Mean=13.2] ]
|
|
]
|
|
|
|
[h4 Testing]
|
|
|
|
Accuracy tests use data generated at very high precision
|
|
(with [@http://shoup.net/ntl/doc/RR.txt NTL RR class]
|
|
set at 1000-bit precision: about 300 decimal digits)
|
|
and a deliberately naive calculation of [Gamma](x)/[Gamma](y).
|
|
|
|
[h4 Implementation]
|
|
|
|
The implementation of these functions is very similar to that of
|
|
__beta, and is based on combining similar power terms
|
|
to improve accuracy and avoid spurious overflow/underflow.
|
|
|
|
In addition there are optimisations for the situation where /delta/
|
|
is a small integer: in which case this function is basically
|
|
the reciprocal of a rising factorial, or where both arguments
|
|
are smallish integers: in which case table lookup of factorials
|
|
can be used to calculate the ratio.
|
|
|
|
[endsect][/section:gamma_ratios Ratios of Gamma Functions]
|
|
|
|
[/
|
|
Copyright 2006 John Maddock and Paul A. Bristow.
|
|
Distributed under the Boost Software License, Version 1.0.
|
|
(See accompanying file LICENSE_1_0.txt or copy at
|
|
http://www.boost.org/LICENSE_1_0.txt).
|
|
]
|
|
|