-
Notifications
You must be signed in to change notification settings - Fork 8
/
Copy pathsqrt.scm
48 lines (42 loc) · 1.49 KB
/
sqrt.scm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
(import (rationals.scm))
(define (average x y)
(mul_rat (add_rat x y)
(makerat 1 2)))
;(average (makerat 1 2))
; (makerat 1 3))))
(define (improve x guess)
(average guess (div_rat x guess)))
;(improve (makerat 2 1))
; (makerat 2 1))))
(define (good_enough guess x)
(<rat (pos_diff_rat
(square_rat guess)
x)
(makerat 1 100)))
;(good_enough (makerat 20001 15000))
; (makerat 4 1))))
(macro sqrt_h (x g) (improve x g));one improve
(macro sqrt_h2 (x g) (sqrt_h x (sqrt_h x g)));two improves
(define (sqrt2 guess x)
(sqrt_h2 x (sqrt_h2 x (sqrt_h2 x guess))))
(define (sqrt6 x);this calculates the sqrt using 6 iterations of the algorithm
(sqrt2 x x))
;(sqrt6 (makerat 144 100))))
(define (sqrt_times_h N guess x)
(cond (((< N 1) guess)
(true (sqrt_times_h (- N 1)
(improve x guess)
x
)))))
(define (sqrt_times N X);this is so you can choose to do any number of iterations
(sqrt_times_h N X X))
;(sqrt_times 4 (makerat 2 1))
(define (sqrt3 X guess)
(cond (((good_enough guess X) guess)
(true (sqrt3 X
(improve X guess))))))
;(sqrt3 (makerat 10 1) (makerat 10 1))
(define (sqrt x);this one keeps iterating until the answer is good enough
(sqrt3 x x))
;(sqrt (sqrt (makerat 10 1)))
1