32 #ifndef MCKL_MATH_GAMMA_HPP 33 #define MCKL_MATH_GAMMA_HPP 48 0.011413521097787704, 0.027972308950302116, 0.051727015600492421,
49 0.082502225484340941, 0.12007019910960293, 0.16415283300752470,
50 0.21442376986779355, 0.27051082840644336, 0.33199876341447887,
51 0.39843234186401943, 0.46931971407375483, 0.54413605556657973,
52 0.62232745288031077, 0.70331500465597174, 0.78649910768313447,
53 0.87126389619061517, 0.95698180152629142};
56 0.012915947284065419, 0.020181515297735382, 0.027298621498568734,
57 0.034213810770299537, 0.040875750923643261, 0.047235083490265582,
58 0.053244713977759692, 0.058860144245324798, 0.064039797355015485,
59 0.068745323835736408, 0.072941885005653087, 0.076598410645870640,
60 0.079687828912071670, 0.082187266704339706, 0.084078218979661945,
61 0.085346685739338721, 0.085983275670394821};
69 std::max(a1 + 11.5 * sqrta1, x + 6 * sqrta1) :
70 std::max(0.0, std::min(a1 - 7.5 * sqrta1, x - 5 * sqrta1));
73 double t = x + (xu - x) * gammap_approx_y[i];
74 sum += gammap_approx_w[i] *
79 return psig ? (x > a1 ? 1 - ans : -ans) : (x > a1 ? ans : 1 + ans);
84 constexpr
double eps = std::numeric_limits<double>::epsilon();
101 constexpr
double eps = std::numeric_limits<double>::epsilon();
102 constexpr
double fpmin = std::numeric_limits<double>::min() / eps;
104 double b = x + 1 - a;
105 double c = 1.0 / fpmin;
111 double an = -n * (n - a);
138 if (x < 0 || a <= 0) {
139 return const_nan<double>();
141 if (!(x > 0 || x < 0)) {
157 constexpr
double eps = 1e-8;
160 return const_nan<double>();
163 return const_inf<double>();
169 const double a1 = a - 1;
177 afrac =
std::exp(a1 * (lna1 - 1) - gln);
178 double z = y < 0.5 ? y : 1 - y;
180 x = (2.30753 + t * 0.27061) / (1 + t * (0.99229 + t * 0.04481)) - t;
187 double t = 1 - a * (0.253 + a * 0.12);
188 x = y < t ?
std::pow(y / t, 1 / a) :
189 1 -
std::log(1 - (y - t) / (1 - t));
192 for (
int i = 0; i != 12; ++i) {
197 double err =
gammap(a, x) - y;
202 t = u / (1 - 0.5 * std::min(1.0, u * (a1 / x - 1)));
218 #endif // MCKL_MATH_GAMMA_HPP void pow(std::size_t n, const float *a, const float *b, float *y)
double gammap_approx(double a, double x, bool psig)
static constexpr double gammap_approx_w[]
static constexpr std::size_t gammap_approx_n
static constexpr double gammap_approx_y[]
void lgamma(std::size_t n, const float *a, float *y)
double gammapinv(double a, double y)
Inverse regularized lower incomplete Gamma function.
void log(std::size_t n, const float *a, float *y)
double gammap(double a, double x)
Regularized lower incomplete Gamma function.
void abs(std::size_t n, const float *a, float *y)
double gammap_gser(double a, double x)
double gammap_gcf(double a, double x)
void sqrt(std::size_t n, const float *a, float *y)
void exp(std::size_t n, const float *a, float *y)