/// Normalized incomlete gamma functions. double gamma_q(double a, double x) { gsl_sf_result result; int stat = gsl_sf_gamma_inc_Q_e(a, x, &result); if (stat != GSL_SUCCESS) { std::ostringstream msg("Error in gamma_q:"); msg << " a=" << a << " x=" << x; throw std::runtime_error(msg.str()); } else return result.val; }
static int gamma_inc_a_gt_0(double a, double x, gsl_sf_result * result) { /* x > 0 and a > 0; use result for Q */ gsl_sf_result Q; gsl_sf_result G; const int stat_Q = gsl_sf_gamma_inc_Q_e(a, x, &Q); const int stat_G = gsl_sf_gamma_e(a, &G); result->val = G.val * Q.val; result->err = fabs(G.val * Q.err) + fabs(G.err * Q.val); result->err += 2.0*GSL_DBL_EPSILON * fabs(result->val); return GSL_ERROR_SELECT_2(stat_G, stat_Q); }
double gsl_sf_gamma_inc_Q(const double a, const double x) { EVAL_RESULT(gsl_sf_gamma_inc_Q_e(a, x, &result)); }