| my-sqrt.c - En brugbar implementation af my_sqrt implementeret via rodsøgningsfunktionen. | Lektion 3 - slide 26 : 26 Program 2 |
#include <stdio.h>
#include <math.h>
/* #define NDEBUG 1 */
#include <assert.h>
int isSmallNumber(double x){
return (fabs(x) < 0.0000001);
}
double displacement;
double f (double x){
return (x * x - displacement);
}
int sameSign(double x, double y){
return x * y > 0.0;
}
double middleOf(double x, double y){
return x + (y - x)/2;
}
double findRootBetween(double l, double u){
while (!isSmallNumber(f(middleOf(l,u)))){
if(sameSign(f(middleOf(l,u)), f(u)))
u = middleOf(l,u);
else
l = middleOf(l,u);
}
return middleOf(l,u);
}
double my_sqrt(double x){
double res;
assert(x >= 0);
displacement = x;
res = findRootBetween(0,x);
assert(isSmallNumber(res*res - x));
return res;
}
int main(void) {
printf("my_sqrt(15.0): %lf\n", my_sqrt(15.0));
printf("my_sqrt(20.0): %lf\n", my_sqrt(20.0));
printf("my_sqrt(2.0): %lf\n", my_sqrt(2.0));
printf("my_sqrt(16.0): %lf\n", my_sqrt(16.0));
return 0;
}