public static double QExp(double p, double scale = 1.0, bool lowerTail = true, bool logP = false) { if (double.IsNaN(p) || double.IsNaN(scale)) { return(p + scale); } if (scale < 0) { return(double.NaN); //ML_ERR_return_NAN; } if ((logP && p > 0) || (!logP && (p < 0 || p > 1))) //ML_ERR_return_NAN { return(RVaria.R_NaN); } if (p == (lowerTail ? (logP ? double.NegativeInfinity : 0.0) : (logP ? 0.0 : 1.0))) { return(0); } return(-scale * (lowerTail ? (logP ? ((p) > -RVaria.M_LN2 ? Math.Log(-RVaria.expm1(p)) : RVaria.log1p(-Math.Exp(p))) : RVaria.log1p(-p)) : (logP ? (p) : Math.Log(p)))); }
public static double[] PExp(double[] xA, double scale = 1.0, bool lowerTail = true, bool logP = false) { double[] rep = new double[xA.Length]; for (int i = 0; i < xA.Length; i++) { double x = xA[i]; if (double.IsNaN(x) || double.IsNaN(scale)) { rep[i] = x + scale; } if (scale < 0) { rep[i] = double.NaN; } if (x <= 0.0) { rep[i] = (lowerTail ? (logP ? double.NegativeInfinity : 0.0) : (logP ? 0.0 : 1.0)); } /* same as weibull( shape = 1): */ x = -(x / scale); if (lowerTail) { rep[i] = (logP ? (x > -RVaria.M_LN2 ? Math.Log(-RVaria.expm1(x)) : RVaria.log1p(-Math.Exp(x))) : -RVaria.expm1(x)); } /* else: !lower_tail */ else { rep[i] = (logP ? (x) : Math.Exp(x)); } } return(rep); }