summaryrefslogtreecommitdiff
path: root/gsl-1.9/specfunc/cheb_eval_mode.c
diff options
context:
space:
mode:
Diffstat (limited to 'gsl-1.9/specfunc/cheb_eval_mode.c')
-rw-r--r--gsl-1.9/specfunc/cheb_eval_mode.c30
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;
+}