| [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). |
| ] |
| |