我已经开始研究SICP,并将repl.it用于代码练习。现在我想在本地编写代码。我已经安装了mit-scheme应用程序,并试图将我的代码从repl.it移到我的计算机上。
但是当我尝试运行计算平方根的程序时,得到的结果非常奇怪,结果非常大:
1 ]=> (define (square x) (* x x))
;Value: square
1 ]=> (define (abs x) (if (<= x 0) (- x) x))
;Value: abs
1 ]=> (define (average x y) (/ (+ x y) 2))
;Value: average
1 ]=> (define (improve guess x) (average guess (/ x guess)))
;Value: improve
1 ]=> (define (good-enough? new_guess old_guess)
(< (abs (- new_guess old_guess)) 0.000000000000001))
;Value: good-enough?
1 ]=> (define (sqrt-iter guess x)
(define new_guess (improve guess x))
(if (good-enough? new_guess guess)
new_guess
(sqrt-iter new_guess x)))
;Value: sqrt-iter
1 ]=> (define (sqrt x) (sqrt-iter 1 x))
;Value: sqrt
1 ]=> (sqrt 16)
;Value: 271050543121377825343773346473727756780989953/67762635780343597914988263490310774732975168
1 ]=>
End of input stream reached.
这是程序的源代码,在repl.it上运行良好:
(define (square x) (* x x))
(define (abs x)
(if (<= x 0) (- x) x))
(define (average x y)
(/ (+ x y) 2))
(define (improve guess x)
(average guess (/ x guess)))
(define (good-enough? new_guess old_guess)
(< (abs (- new_guess old_guess)) 0.000000000000001))
(define (sqrt-iter guess x)
(define new_guess (improve guess x))
(if (good-enough? new_guess guess)
new_guess
(sqrt-iter new_guess x)))
(define (sqrt x) (sqrt-iter 1 x))
(sqrt 16)
Note:操作系统:MacOS Catalina,mit-scheme应用程序版本-10.1.11
如何解决此错误?
这不是一个大数字,实际上它只是接近4.0的小数,请仔细看:
271050543121377825343773346473727756780989953 / 67762635780343597914988263490310774732975168
通过切换到不精确的数字,您将获得所需的结果,只需将初始猜测设为小数点:
(define (sqrt x) (sqrt-iter 1.0 x))