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