奇怪的mit-scheme解释器行为

问题描述 投票:0回答:1

我已经开始研究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

如何解决此错误?

scheme sicp
1个回答
0
投票

这不是一个大数字,实际上它只是接近4.0的小数,请仔细看:

271050543121377825343773346473727756780989953 / 67762635780343597914988263490310774732975168

通过切换到不精确的数字,您将获得所需的结果,只需将初始猜测设为小数点:

(define (sqrt x) (sqrt-iter 1.0 x))
© www.soinside.com 2019 - 2024. All rights reserved.