From 21d0ffbbf001fd209208e33503890ad6847105db Mon Sep 17 00:00:00 2001 From: rodri Date: Sat, 6 Jan 2024 16:15:33 +0000 Subject: sqrt by Heron's method. --- sqrt.c | 71 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 sqrt.c diff --git a/sqrt.c b/sqrt.c new file mode 100644 index 0000000..5a78693 --- /dev/null +++ b/sqrt.c @@ -0,0 +1,71 @@ +#include +#include + +int iters; + +/* + * Heron's method to compute the √ + * + * iteratively do + * x1 = ½(x0 + n/x0) + * since + * lim M→∞ (xM) = √n + */ +//double +//√(double n) +//{ +// int i; +// double x; +// +// x = 2; +// for(i = 0; i < iters; i++) +// x = 0.5*(x + n/x); +// return x; +//} + +double +√(double n) +{ + double x0, x; + + if(n == 0) + return 0; + + x0 = -1; + x = n > 1? n/2: 1; + while(x0 != x){ + x0 = x; + x = 0.5*(x0 + n/x0); + iters++; + } + return x; +} + +void +usage(void) +{ + fprint(2, "usage: %s number [prec]\n", argv0); + exits("usage"); +} + +void +main(int argc, char *argv[]) +{ + int prec; + double n; + + prec = 10; + ARGBEGIN{ + default: usage(); + }ARGEND + if(argc < 1) + usage(); + + n = strtod(argv[0], nil); + if(n < 0) + sysfatal("too complex"); + if(argc > 2) + prec = strtoul(argv[1], nil, 10); + print("√%g = %.*f (took %d iterations)\n", n, prec, √(n), iters); + exits(nil); +} -- cgit v1.2.3