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