SICP 1.6-1.8

1.6
由于scheme应用序求值的性质,该函数会陷入循环(一直计算 improve guess x)

1.7

值过小,0.001这个精度远远不够...

值过大,由于浮点数精度有限,(比如使用IEEE754浮点数标准, 32位浮点数表示123456789这样的数会有严重的精度丢失), 所以无法得出正确求两个较大的数的差.

 1 (define (abs x)
 2   (if (>= x 0)
 3       x
 4       (- x)))
 5 
 6 (define (average a b)
 7   (/ (+ a b) 2))
 8 
 9 (define (improve guess x)
10   (average guess
11            (/ x guess)))
12 
13 (define (good-enough? guess x)
14   (< (/ (abs (- (improve guess x)
15                 guess))
16         guess)
17      0.01))
18 
19 (define (sqrt-iter guess x)
20   (cond ((good-enough? guess x) guess)
21         (else (sqrt-iter (improve guess x) x))
22         ))
23 
24 
25 (define (sqrt x)
26   (sqrt-iter 1.0 x))



---> 原则上可以的,但是其实精度损失是肯定的...

1.8

 1 (define (improve2 guess x)
 2   (/ (+ (/ x
 3            (* guess guess))
 4         (* 2 guess))
 5      3))
 6 
 7 (define (good-enough2? guess x)
 8   (< (/ (abs (- (improve2 guess x)
 9                 guess))
10         guess)
11      0.01))
12 
13 (define (cbrt-iter guess x)
14   (cond ((good-enough2? guess x) guess)
15         (else (cbrt-iter (improve2 guess x)
16                          x))))
17 
18 (define (cbrt x)
19   (cbrt-iter 1.0 x))
原文地址:https://www.cnblogs.com/nzhl/p/5450364.html