| functions/root-rek.c - Hele rodsøgningsprogrammet. | Lektion 6 - slide 12 : 21 Program 6 |
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
double f (double x){
/* (x - 5.0) * (x - 3.0) * (x + 7.0) */
return (x*x*x - x*x - 41.0 * x + 105.0);
}
int sameSign(double x, double y){
return x * y >= 0.0;
}
double middleOf(double x, double y){
return x + (y - x)/2;
}
int isSmallNumber(double x){
return (fabs(x) < 0.0000001);
}
double findRootBetween(double l, double u){
if (isSmallNumber(f(middleOf(l,u))))
return middleOf(l,u);
else if (sameSign(f(middleOf(l,u)), f(u)))
return findRootBetween(l, middleOf(l,u));
else if (!sameSign(f(middleOf(l,u)), f(u)))
return findRootBetween(middleOf(l,u),u);
else exit(-1);
}
int main (void){
double x, y;
int numbers;
printf("RECURSIVE ROOT FINDING\n\n");
do{
printf("%s","Find a ROOT between which numbers: ");
numbers = scanf("%lf%lf", &x, &y);
if (numbers == 2 && !sameSign(f(x),f(y))){
double solution = findRootBetween(x,y);
printf("\nThere is a root in %lf\n", solution);
}
else if (numbers == 2 && sameSign(f(x),f(y)))
printf("\nf must have different signs in %lf and %lf\n",
x, y);
else if (numbers != 2)
printf("\nBye\n\n");
}
while (numbers == 2);
return 0;
}