diff --git a/includes/libft.h b/includes/libft.h index 99aca00..59b3573 100644 --- a/includes/libft.h +++ b/includes/libft.h @@ -133,7 +133,7 @@ int ft_fsign(double i); double ft_modf(double x, double *int_part); double ft_pow(double base, int exponent); double ft_round(double x); -int ft_sqrt(int i); +double ft_sqrt(double i); void ft_free_tab(char **tab); int ft_arrint(int *intarr, int comp, size_t size); diff --git a/srcs/ft_sqrt.c b/srcs/ft_sqrt.c index 04c1483..63ec754 100644 --- a/srcs/ft_sqrt.c +++ b/srcs/ft_sqrt.c @@ -1,15 +1,41 @@ #include "libft.h" /* -** return the square root of nb -** or the integer value of it -*/ -int ft_sqrt(int nb) + * return the square root of nb + * Newton–Raphson method : https://en.wikipedia.org/wiki/Newton%27s_method#Use_of_Newton's_method_to_compute_square_roots + */ +double ft_sqrt(double x) { - int i; + double precision; - i = 0; - while ((i*i) < nb) - i++; - return (i); + if (x < 0) + return -1; // handle negative numbers + if (x == 0) + return 0; + + precision = 0.00001; + + // Newton-Raphson + double guess = x; + double prev_guess; + do + { + prev_guess = guess; + guess = (guess + x / guess) / 2.0; + } while (prev_guess - guess > precision); + return guess; + + // // binary search + // double low = 0 + // double high = x; + // double mid; + // while (high - low > precision) + // { + // mid = (low + high) / 2.0; + // if (mid * mid < x) + // low = mid; + // else + // high = mid; + // } + // return (low + high) / 2.0; } diff --git a/testing/srcs/test_sqrt.c b/testing/srcs/test_sqrt.c index 04c1483..20c2392 100644 --- a/testing/srcs/test_sqrt.c +++ b/testing/srcs/test_sqrt.c @@ -1,15 +1,15 @@ #include "libft.h" -/* -** return the square root of nb -** or the integer value of it -*/ -int ft_sqrt(int nb) -{ - int i; +// /* +// ** return the square root of nb +// ** or the integer value of it +// */ +// int ft_sqrt(int nb) +// { +// int i; - i = 0; - while ((i*i) < nb) - i++; - return (i); -} +// i = 0; +// while ((i*i) < nb) +// i++; +// return (i); +// }