1 static inline int 2 cheb_eval_mode_e(const cheb_series * cs, 3 const double x, 4 gsl_mode_t mode, 5 gsl_sf_result * result) 6 { 7 int j; 8 double d = 0.0; 9 double dd = 0.0; 10 11 double y = (2.*x - cs->a - cs->b) / (cs->b - cs->a); 12 double y2 = 2.0 * y; 13 14 int eval_order; 15 16 if(GSL_MODE_PREC(mode) == GSL_PREC_DOUBLE) 17 eval_order = cs->order; 18 else 19 eval_order = cs->order_sp; 20 21 for(j = eval_order; j>=1; j--) { 22 double temp = d; 23 d = y2*d - dd + cs->c[j]; 24 dd = temp; 25 } 26 27 result->val = y*d - dd + 0.5 * cs->c[0]; 28 result->err = GSL_DBL_EPSILON * fabs(result->val) + fabs(cs->c[eval_order]); 29 return GSL_SUCCESS; 30 } 31