diff options
author | Patrick Simianer <p@simianer.de> | 2014-06-15 03:24:33 +0200 |
---|---|---|
committer | Patrick Simianer <p@simianer.de> | 2014-06-15 03:24:33 +0200 |
commit | cf3a29feb5887344b6633ead1b4b6d5657a15a4b (patch) | |
tree | f1149508f7305a48dba0226699dfafdd68d81969 /algorithms/polynomial.c | |
parent | 5ddc763ab9953eebdaf78af4eb72288d7955b310 (diff) |
old stuff: algorithms
Diffstat (limited to 'algorithms/polynomial.c')
-rw-r--r-- | algorithms/polynomial.c | 68 |
1 files changed, 68 insertions, 0 deletions
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 <stdio.h> +#include <stdlib.h> +#include <math.h> + +#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; +} + |