public static double logBeta(double a, double b) { double corr, ans; double p = JMath.min(a, b); double q = JMath.max(a, b); if (p <= 0.0) { ans = double.NaN; } else if (p >= 10.0) { corr = r9lgmc(p) + r9lgmc(q) - r9lgmc(p + q); double temp = dlnrel(-p / (p + q)); ans = -0.5 * JMath.log(q) + 0.918938533204672741780329736406 + corr + (p - 0.5) * JMath.log(p / (p + q)) + q * temp; } else if (q >= 10.0) { corr = Sfun.r9lgmc(q) - r9lgmc(p + q); ans = logGamma(p) + corr + p - p * JMath.log(p + q) + (q - 0.5) * dlnrel(-p / (p + q)); } else { ans = JMath.log(gamma(p) * (gamma(q) / gamma(p + q))); } return(ans); }
private static double dlnrel(double x) { double ans; if (x <= -1.0) { ans = double.NaN; } else if (JMath.abs(x) <= 0.375) { ans = x * (1.0 - x * Sfun.csevl(x / .375, ALNRCS_COEF)); } else { ans = JMath.log(1.0 + x); } return(ans); }
internal override Symbolic PreEval(Symbolic x) { return(new Complex(Sfun.logGamma(x.ToComplex().Re))); }
internal override Zahl f(Zahl x) { return(new Unexakt(Sfun.logGamma(x.unexakt().real))); }