Blame


1 665c255d 2023-08-04 jrmu ;; (define (sqrt x)
2 665c255d 2023-08-04 jrmu ;; (sqrt-iter 1.0 x))
3 665c255d 2023-08-04 jrmu ;; (define (sqrt-iter guess x)
4 665c255d 2023-08-04 jrmu ;; (if (good-enough? guess x)
5 665c255d 2023-08-04 jrmu ;; guess
6 665c255d 2023-08-04 jrmu ;; (sqrt-iter (improve guess x) x)))
7 665c255d 2023-08-04 jrmu ;; (define (good-enough? guess x)
8 665c255d 2023-08-04 jrmu ;; (< (abs (- (square guess) x)) 0.001))
9 665c255d 2023-08-04 jrmu ;; (define (square x) (* x x))
10 665c255d 2023-08-04 jrmu ;; (define (improve guess x)
11 665c255d 2023-08-04 jrmu ;; (average guess (/ x guess)))
12 665c255d 2023-08-04 jrmu ;; (define (average x y)
13 665c255d 2023-08-04 jrmu ;; (/ (+ x y) 2))
14 665c255d 2023-08-04 jrmu
15 665c255d 2023-08-04 jrmu ;; (sqrt 0.001)
16 665c255d 2023-08-04 jrmu ;; 0.0316227766
17 665c255d 2023-08-04 jrmu ;; error is quite large
18 665c255d 2023-08-04 jrmu ;; for small numbers, the reason is simply because the sqrt is too close to the tolerance of 0.001
19 665c255d 2023-08-04 jrmu
20 665c255d 2023-08-04 jrmu ;; (sqrt 1234567890123456789012345678901234567890)
21 665c255d 2023-08-04 jrmu
22 665c255d 2023-08-04 jrmu ;; 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.
23 665c255d 2023-08-04 jrmu
24 665c255d 2023-08-04 jrmu (define (sqrt x)
25 665c255d 2023-08-04 jrmu (sqrt-iter 1.0 0.0 x))
26 665c255d 2023-08-04 jrmu (define (sqrt-iter guess prev-guess x)
27 665c255d 2023-08-04 jrmu (if (good-enough? guess prev-guess)
28 665c255d 2023-08-04 jrmu guess
29 665c255d 2023-08-04 jrmu (sqrt-iter (improve guess x) guess x)))
30 665c255d 2023-08-04 jrmu (define (good-enough? guess prev-guess)
31 665c255d 2023-08-04 jrmu (< (/ (abs (- guess prev-guess)) guess) 0.001))
32 665c255d 2023-08-04 jrmu (define (square x) (* x x))
33 665c255d 2023-08-04 jrmu (define (improve guess x)
34 665c255d 2023-08-04 jrmu (average guess (/ x guess)))
35 665c255d 2023-08-04 jrmu (define (average x y)
36 665c255d 2023-08-04 jrmu (/ (+ x y) 2))
37 665c255d 2023-08-04 jrmu
38 665c255d 2023-08-04 jrmu (sqrt 0.001)
39 665c255d 2023-08-04 jrmu ;; 0.0316227766
40 665c255d 2023-08-04 jrmu
41 665c255d 2023-08-04 jrmu ;; Much better for small numbers