diff options
Diffstat (limited to 'gsl-1.9/specfunc/cheb_eval_mode.c')
-rw-r--r-- | gsl-1.9/specfunc/cheb_eval_mode.c | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/gsl-1.9/specfunc/cheb_eval_mode.c b/gsl-1.9/specfunc/cheb_eval_mode.c new file mode 100644 index 0000000..80127de --- /dev/null +++ b/gsl-1.9/specfunc/cheb_eval_mode.c @@ -0,0 +1,30 @@ +static inline int +cheb_eval_mode_e(const cheb_series * cs, + const double x, + gsl_mode_t mode, + gsl_sf_result * result) +{ + int j; + double d = 0.0; + double dd = 0.0; + + double y = (2.*x - cs->a - cs->b) / (cs->b - cs->a); + double y2 = 2.0 * y; + + int eval_order; + + if(GSL_MODE_PREC(mode) == GSL_PREC_DOUBLE) + eval_order = cs->order; + else + eval_order = cs->order_sp; + + for(j = eval_order; j>=1; j--) { + double temp = d; + d = y2*d - dd + cs->c[j]; + dd = temp; + } + + result->val = y*d - dd + 0.5 * cs->c[0]; + result->err = GSL_DBL_EPSILON * fabs(result->val) + fabs(cs->c[eval_order]); + return GSL_SUCCESS; +} |