#include #include /* #define NDEBUG 1 */ #include 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; }