in commons-numbers-gamma/src/main/java/org/apache/commons/numbers/gamma/BoostGamma.java [2080:2128]
static double tgammaDeltaRatio(double z, double delta) {
final double zDelta = z + delta;
if (Double.isNaN(zDelta)) {
// One or both arguments are NaN
return Double.NaN;
}
if (z <= 0 || zDelta <= 0) {
// This isn't very sophisticated, or accurate, but it does work:
return tgamma(z) / tgamma(zDelta);
}
// Note: Directly calling tgamma(z) / tgamma(z + delta) if possible
// without overflow is not more accurate
if (Math.rint(delta) == delta) {
if (delta == 0) {
return 1;
}
//
// If both z and delta are integers, see if we can just use table lookup
// of the factorials to get the result:
//
if (Math.rint(z) == z &&
z <= MAX_GAMMA_Z && zDelta <= MAX_GAMMA_Z) {
return FACTORIAL[(int) z - 1] / FACTORIAL[(int) zDelta - 1];
}
if (Math.abs(delta) < 20) {
//
// delta is a small integer, we can use a finite product:
//
if (delta < 0) {
z -= 1;
double result = z;
for (int d = (int) (delta + 1); d != 0; d++) {
z -= 1;
result *= z;
}
return result;
}
double result = 1 / z;
for (int d = (int) (delta - 1); d != 0; d--) {
z += 1;
result /= z;
}
return result;
}
}
return tgammaDeltaRatioImpLanczos(z, delta);
}