lgamma function

double lgamma(
  1. double x
)

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);
}