10 #if defined(__INTEL_COMPILER) 11 # pragma warning (disable:279) 20 double zp = 2.50662827563479526904;
21 zp += 225.525584619175212544/x;
22 zp -= 268.295973841304927459/(x+1.0);
23 zp += 80.9030806934622512966/(x+2.0);
24 zp -= 5.00757863970517583837/(x+3.0);
25 zp += 0.0114684895434781459556/(x+4.0);
29 return std::log(zp)+(x-0.5)*std::log(x1)-x1;
37 static double vnl_gamma_series(
double a,
double x)
52 std::cerr<<
"vnl_gamma_series : Failed to converge in "<<
MAX_ITS<<
" steps\n" 53 <<
"a = "<<a<<
" x= "<< x <<
"\nReturning best guess.\n";
57 assert(!
"vnl_gamma_series - x less than 0");
66 static double vnl_gamma_cont_frac(
double a,
double x)
87 std::cerr<<
"vnl_gamma_cont_frac : Failed to converge in "<<
MAX_ITS<<
" steps\n" 88 <<
"a = "<<a<<
" x= "<<x<<std::endl;
94 if (x < 0.0 || a <= 0.0)
95 assert(!
"vnl_gamma_p - Invalid arguments.");
98 return vnl_gamma_series(a,x);
100 return 1.0 - vnl_gamma_cont_frac(a,x);
105 if (x < 0.0 || a <= 0.0)
106 assert(!
"vnl_gamma_q - Invalid arguments.");
109 return 1.0-vnl_gamma_series(a,x);
111 return vnl_gamma_cont_frac(a,x);
116 double t0 = (z-0.5)/(z+4.65)-1.0;
117 double tlg = std::log(4.65+z);
118 double tc = 2.50662827563479526904;
119 double t1 = 225.525584619175212544/z;
120 double t2 = -268.295973841304927459/(1+z);
121 double t3 = +80.9030806934622512966/(2+z);
122 double t4 = -5.00757863970517583837/(3+z);
123 double t5 = 0.0114684895434781459556/(4+z);
124 double neu = t1/z + t2/(1+z) + t3/(2+z) + t4/(3+z) + t5/(4+z);
125 double den = tc + t1 + t2 + t3 + t4 + t5;
126 return t0 -(neu/den) + tlg;
double vnl_digamma(double z)
approximate digamma function, dLog[gamma[z]]/dz.
double vnl_gamma_q(double a, double x)
Normalised Incomplete gamma function, Q(a,x).
double vnl_log_gamma(double x)
Approximate gamma function.
Complete and incomplete gamma function approximations.
double vnl_gamma_p(double a, double x)
Normalised Incomplete gamma function, P(a,x).
const double vnl_very_small