>固定,
这不是一个巨大的数字,而是两个巨大数字的一小部分,所以我得到了一个假警报算法是正确的;修改最后一个输入
参数,现在解释器将其检索为十进制逗号,并且
看起来是个小数目。
我在做SICP的练习1.8,Scheme的翻译在评估我的算法时返回错误的答案。有人知道为什么吗?
牛顿求立方根的方法是基于这样一个事实
如果y是x的立方根的近似值,那么
值(x/(y+2)+(2×y))/ 3给出一个较好的近似值。
使用此公式可实现类似于平方根过程的立方根过程。
(define (cubert x)
(cubert-iter x x 1))
(define (cubert-iter x previous guess)
(if (good-enough previous guess)
guess
(cubert-iter x guess (improve x guess))))
(define (improve x guess)
(/ (+ (/ x
(square guess))
(* 2
guess))
3))
(define (good-enough previous guess)
(< (/ (max (square previous)
(square guess))
(min (square previous)
(square guess)))
tolerance))
(define tolerance 2)
(cubert 1000)f r e e z e s给出一个巨大的100位数字
(cubert 27)返回类似3049534534593845092305345的内容
它可能有一个评估顺序错误,但我看不出来
最佳答案
scheme将在大多数具有精确fixnum的实现中尝试在整个执行期间保持这些数字的精确性。如果你要对一些永远不能有精确浮点数的事物进行除法,比如1
除以3
:
(/ 1 3)
; ==> 1/3
得到精确的值
1/3
。(cubert 27)
的结果完全是fixnum操作,因此它也将产生一个分数结果:(cubert 27)
; ==> 3 5164693972157389706641814378288819200000000/10804364367444398305386468912180491314165089
如果你想要一个不太精确的数字,比如一个浮点数,你可以从一个不精确的值开始强制它,或者你可以在之后用
exact->inexact
转换精确的结果:(cubert #i27) ; ==> 3.48
(exact->inexact (cubert 27)) ; ==> 3.48
你也可以在你的算法中使用不精确的
2
,即#i2
或'2.02,来预测它。这将迫使一个不精确的结果。