这不是一个庞大的数字,只是两个巨大数字的一小部分,所以我得到了一个误报。算法是正确的;修改最后一个输入 参数现在解释器将其检索为十进制逗号,和 看起来像是一直以来的小数字。
我正在从SICP做练习1.8,当我评估算法时,Scheme的解释器̵f̵̵r̵̵e̵̵e̵̵z̵̵e̵s̵会返回错误的答案。有人知道为什么吗?
牛顿的立方根的方法是基于这样的事实 如果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的内容 它可能有一个评估订单错误,但我看不到它
答案 0 :(得分:1)
Scheme在大多数具有精确fixnums的实现中都会尝试在整个执行过程中保持这些数字的准确性。如果你要分割一些永远不会有精确浮动的东西,比如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,当你繁殖时。这将迫使结果不准确。