gnm_float pgumbel (gnm_float x, gnm_float mu, gnm_float beta, gboolean lower_tail, gboolean log_p) { gnm_float z, lp; if (!(beta > 0) || gnm_isnan (mu) || gnm_isnan (beta) || gnm_isnan (x)) return gnm_nan; z = (x - mu) / beta; lp = -gnm_exp (-z); if (lower_tail) return log_p ? lp : gnm_exp (lp); else return log_p ? swap_log_tail (lp) : 0 - gnm_expm1 (lp); }
gnm_float qcauchy (gnm_float p, gnm_float location, gnm_float scale, gboolean lower_tail, gboolean log_p) { if (gnm_isnan(p) || gnm_isnan(location) || gnm_isnan(scale)) return p + location + scale; R_Q_P01_check(p); if (scale < 0 || !gnm_finite(scale)) ML_ERR_return_NAN; if (log_p) { if (p > -1) /* The "0" here is important for the p=0 case: */ lower_tail = !lower_tail, p = 0 - gnm_expm1 (p); else p = gnm_exp (p); } if (lower_tail) scale = -scale; return location + scale / gnm_tan(M_PIgnum * p); }