74 static const double a[] = {
75 -3.969683028665376e+01, 2.209460984245205e+02,
76 -2.759285104469687e+02, 1.383577518672690e+02,
77 -3.066479806614716e+01, 2.506628277459239e+00
79 static const double b[] = {
80 -5.447609879822406e+01, 1.615858368580409e+02,
81 -1.556989798598866e+02, 6.680131188771972e+01,
82 -1.328068155288572e+01
84 static const double c_arr[] = {
85 -7.784894002430293e-03, -3.223964580411365e-01,
86 -2.400758277161838e+00, -2.549732539343734e+00,
87 4.374664141464968e+00, 2.938163982698783e+00
89 static const double d[] = {
90 7.784695709041462e-03, 3.224671290700398e-01,
91 2.445134137142996e+00, 3.754408661907416e+00
93 static const double p_low = 0.02425;
94 static const double p_high = 1.0 - p_low;
97 const double q = std::sqrt(-2.0 * std::log(p));
98 return (((((c_arr[0]*q + c_arr[1])*q + c_arr[2])*q
99 + c_arr[3])*q + c_arr[4])*q + c_arr[5])
100 / ((((d[0]*q + d[1])*q + d[2])*q + d[3])*q + 1.0);
103 const double q = p - 0.5;
104 const double r = q * q;
105 return (((((a[0]*r + a[1])*r + a[2])*r + a[3])*r + a[4])*r + a[5]) * q
106 / (((((b[0]*r + b[1])*r + b[2])*r + b[3])*r + b[4])*r + 1.0);
108 const double q = std::sqrt(-2.0 * std::log(1.0 - p));
109 return -(((((c_arr[0]*q + c_arr[1])*q + c_arr[2])*q
110 + c_arr[3])*q + c_arr[4])*q + c_arr[5])
111 / ((((d[0]*q + d[1])*q + d[2])*q + d[3])*q + 1.0);
126 if (!(a > 0.0) || std::isnan(x))
return kNaN;
127 if (x <= 0.0)
return 0.0;
128 const double lg = std::lgamma(a);
131 double ap = a, sum = 1.0 / a, del = sum;
132 for (
int n = 0; n < 500; ++n) {
136 if (std::fabs(del) < std::fabs(sum) * 1e-15)
137 return sum * std::exp(-x + a * std::log(x) - lg);
142 const double FPMIN = 1e-300;
143 double b = x + 1.0 - a, c = 1.0 / FPMIN, d = 1.0 / b, h = d;
144 for (
int i = 1; i <= 500; ++i) {
145 const double an = -
static_cast<double>(i) * (
static_cast<double>(i) - a);
148 if (std::fabs(d) < FPMIN) d = FPMIN;
150 if (std::fabs(c) < FPMIN) c = FPMIN;
152 const double del = d * c;
154 if (std::fabs(del - 1.0) < 1e-15) {
155 const double q = std::exp(-x + a * std::log(x) - lg) * h;
double lbeta(double a, double b)
ln B(a, b) = lnΓ(a) + lnΓ(b) − lnΓ(a+b), for a, b > 0.