Blob


1 ;; (define (sqrt x)
2 ;; (sqrt-iter 1.0 x))
3 ;; (define (sqrt-iter guess x)
4 ;; (if (good-enough? guess x)
5 ;; guess
6 ;; (sqrt-iter (improve guess x) x)))
7 ;; (define (good-enough? guess x)
8 ;; (< (abs (- (square guess) x)) 0.001))
9 ;; (define (square x) (* x x))
10 ;; (define (improve guess x)
11 ;; (average guess (/ x guess)))
12 ;; (define (average x y)
13 ;; (/ (+ x y) 2))
15 ;; (sqrt 0.001)
16 ;; 0.0316227766
17 ;; error is quite large
18 ;; for small numbers, the reason is simply because the sqrt is too close to the tolerance of 0.001
20 ;; (sqrt 1234567890123456789012345678901234567890)
22 ;; for large numbers, a number must be expressed as a float. A float is made up of a mantissa and exponent. As the exponent gets larger, the difference between each quantum of allowed floating point gets bigger and bigger. Unfortunately, this means that (improve guess x) might give the same result each time, even though (good-enough? guess x) keeps returning #f. So, with each iteration, the guess does not get any more accurate and hence the recursive process is never able to terminate. We end up with infinite recursion.
24 (define (sqrt x)
25 (sqrt-iter 1.0 0.0 x))
26 (define (sqrt-iter guess prev-guess x)
27 (if (good-enough? guess prev-guess)
28 guess
29 (sqrt-iter (improve guess x) guess x)))
30 (define (good-enough? guess prev-guess)
31 (< (/ (abs (- guess prev-guess)) guess) 0.001))
32 (define (square x) (* x x))
33 (define (improve guess x)
34 (average guess (/ x guess)))
35 (define (average x y)
36 (/ (+ x y) 2))
38 (sqrt 0.001)
39 ;; 0.0316227766
41 ;; Much better for small numbers