我一直在使用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模式中(cube-iter 1 x))版本的输出:1592506 ......
mit模式中(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
答案 0 :(得分:2)
这不是一个大整数,它是一个较大的精确比值,例如1/2,该值接近3
,比3.0000005410641766
更准确。仔细观察,您将看到分母和分母之间的/
。
通过使用精确数字,支持完整数字塔的方案实现永远不会降低最常见数学运算的精确性,除非它固有地不精确,例如log
。通过使用一个不精确的值,例如1.0
,由于1
为1
,而1.0
处于{{1}范围内,因此所有结果都不精确}。
由于您逼近立方根,所以我猜1
是可以使用的正确值,因为结果刚好足够,因此在此处返回准确的数字并不真实。如果您正在做其他事情,而结果是准确的,则返回比例是正确的事情,而那些不希望获得精确结果的人可以使用过程1.0
或传递至少一个不精确的值来获得值返回不精确。