lgamma function
Implementation
double lgamma(double x) {
if (x.isNaN) return double.nan;
if (x.isInfinite) return double.infinity;
if (x == 0.0) {
signgam = signbit(x) ? -1 : 1;
return double.infinity;
}
if (x < 0 && x == x.floorToDouble()) {
signgam = 1;
return double.infinity;
}
if (x < 0.5) {
double sinpx = math.sin(M_PI * x);
signgam = sinpx > 0 ? 1 : -1;
if (sinpx == 0) return double.infinity;
return math.log(M_PI / sinpx.abs()) - lgamma(1 - x);
}
signgam = 1;
double z = x - 1;
double sum = _lanczos_c[0];
for (int i = 1; i < _lanczos_g + 2; i++) {
sum += _lanczos_c[i] / (z + i);
}
double t = z + _lanczos_g + 0.5;
return 0.5 * math.log(2 * M_PI) +
(z + 0.5) * math.log(t) -
t +
math.log(sum);
}