static double tgammaDeltaRatio()

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