From cf3a29feb5887344b6633ead1b4b6d5657a15a4b Mon Sep 17 00:00:00 2001 From: Patrick Simianer Date: Sun, 15 Jun 2014 03:24:33 +0200 Subject: old stuff: algorithms --- algorithms/polynomial.c | 68 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 algorithms/polynomial.c (limited to 'algorithms/polynomial.c') diff --git a/algorithms/polynomial.c b/algorithms/polynomial.c new file mode 100644 index 0000000..ecd9027 --- /dev/null +++ b/algorithms/polynomial.c @@ -0,0 +1,68 @@ +#include +#include +#include + +#define EPSILON 1E-9 + + +double +eval_poly(double x, double coeffs[], int order) +{ + double res; + int i; + + res = coeffs[0]; + + for ( i = 1; i <= order; i++ ) { + res = res * x + coeffs[i]; + } + + return res; +} + + +double +find_zero(double left, double right, double coeffs[], int order) +{ + double c, lp, rp, cp, eps=EPSILON; + + if(eval_poly(left, coeffs, order) * eval_poly(right, coeffs, order) >= 0) { + exit(1); + } + + while(1) { + c = (left+right)/2; + + lp = eval_poly(left, coeffs, order); + rp = eval_poly(right, coeffs, order); + cp = eval_poly(c, coeffs, order); + + if(fabs(cp) < eps) { + break; + } + + if(cp * lp < 0) { + right = c; + } + else if(cp * rp < 0) { + left = c; + } + else { + exit(1); + } + } + + return c; +} + +int +main(void) +{ + double coeffs[] = { 7, 5, 3, 2, 1, 1 }; + + printf("eval_poly: %f\n", eval_poly(3, coeffs, 5)); + printf("%f\n", find_zero(-100, 100, coeffs, 5)); + + return 0; +} + -- cgit v1.2.3