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;
}
Exemple #2
0
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;
}