我一直在使用mit-scheme来测试练习中的SICP . 对于练习1.8,您的任务是编写一个类似于给定平方根函数的立方根函数 . 我的解决方案如下:但是,我注意到在cube-root函数中,第一次调用cube-iter . 如果第一个参数是1,则函数返回一个非常大的整数,如果它是1.0,它将使用mit-scheme返回预期结果 . 使用scm解释器时,使用1和1.0时输出之间没有区别 . 我的印象是两者之间应该没有区别 .
码:
(define (cube-root x)
(cube-iter 1 x))
(define (cube-iter guess x)
(if (good-enough? guess x)
guess
(cube-iter (improve guess x) x)))
(define (good-enough? guess x)
(< (abs ( - x (cube guess))) .001))
(define (improve guess x)
(/ (+ (/ x (* guess guess)) (* 2 guess))
3)))
(define (cube x) (* x x x))
mit-scheme中的(cube-iter 1 x))版本的输出:1592506 ......
mit-scheme中(cube-iter 1.0 x))版本的输出:3.0000005410641766
SCM中(cube-iter 1 x))版本的输出:3.0000005410641766
SCM中(cube-iter 1.0 x))版本的输出:3.0000005410641766
mit-scheme的版本是9.2
1 回答
它不是一个大的整数,它是一个像1/2的大型精确raio,它非常接近
3
并且比3.0000005410641766
更准确 . 仔细观察,你会看到提名者和分母之间的/
.通过使用精确数字,支持完整数字塔的方案实现永远不会降低最常见数学运算的准确性,除非它继承不精确,如
log
. 通过使用 one 不精确值,如1.0
,所有结果都是不精确的,因为1
是1
,而1.0
在1
范围内 .由于你接近立方根,我猜
1.0
是正确的值,因为结果足够好所以返回确切的数字并不是真实的 . 如果你正在做其他结果确切返回的事情,那么比率是正确的事情,那些不想要精确结果的人可以使用过程exact->inexact
或传递至少一个不准确的值来获得不准确的值 .