int gsl_sf_erfc_e(double x, gsl_sf_result * result) { const double ax = fabs(x); double e_val, e_err; /* CHECK_POINTER(result) */ if (ax <= 1.0) { double t = 2.0 * ax - 1.0; gsl_sf_result c; cheb_eval_e(&erfc_xlt1_cs, t, &c); e_val = c.val; e_err = c.err; } else if (ax <= 5.0) { double ex2 = exp(-x * x); double t = 0.5 * (ax - 3.0); gsl_sf_result c; cheb_eval_e(&erfc_x15_cs, t, &c); e_val = ex2 * c.val; e_err = ex2 * (c.err + 2.0 * fabs(x) * GSL_DBL_EPSILON); } else if (ax < 10.0) { double exterm = exp(-x * x) / ax; double t = (2.0 * ax - 15.0) / 5.0; gsl_sf_result c; cheb_eval_e(&erfc_x510_cs, t, &c); e_val = exterm * c.val; e_err = exterm * (c.err + 2.0 * fabs(x) * GSL_DBL_EPSILON + GSL_DBL_EPSILON); } else { e_val = erfc8(ax); e_err = (x * x + 1.0) * GSL_DBL_EPSILON * fabs(e_val); } if (x < 0.0) { result->val = 2.0 - e_val; result->err = e_err; result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val); } else { result->val = e_val; result->err = e_err; result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val); } return GSL_SUCCESS; }
nr_double_t fspecial::erfc (nr_double_t x) { const nr_double_t ax = fabs (x); nr_double_t val; if (ax <= 1.0) { nr_double_t t = 2.0 * ax - 1.0; val = cheb_eval (&erfc_xlt1_cs, t); } else if (ax <= 5.0) { nr_double_t ex2 = exp (-x * x); nr_double_t t = 0.5 * (ax - 3.0); val = ex2 * cheb_eval (&erfc_x15_cs, t); } else if (ax < 10.0) { nr_double_t ex = exp(-x * x) / ax; nr_double_t t = (2.0 * ax - 15.0) / 5.0; val = ex * cheb_eval (&erfc_x510_cs, t); } else { val = erfc8 (ax); } return (x < 0.0) ? 2.0 - val : val; }