summaryrefslogtreecommitdiff
path: root/algorithms/polynomial.c
diff options
context:
space:
mode:
authorPatrick Simianer <p@simianer.de>2014-06-15 03:24:33 +0200
committerPatrick Simianer <p@simianer.de>2014-06-15 03:24:33 +0200
commitcf3a29feb5887344b6633ead1b4b6d5657a15a4b (patch)
treef1149508f7305a48dba0226699dfafdd68d81969 /algorithms/polynomial.c
parent5ddc763ab9953eebdaf78af4eb72288d7955b310 (diff)
old stuff: algorithms
Diffstat (limited to 'algorithms/polynomial.c')
-rw-r--r--algorithms/polynomial.c68
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;
+}
+