首页 文章

为什么我的立方根算法错了?在SICP练习1.8

提问于
浏览
3

>已修复,

这不是一个庞大的数字,只是两个巨大数字的一小部分,所以我得到了一个误报 . 算法是正确的;现在修改最后一个输入参数,解释器将其检索为十进制逗号,并且看起来像它一直是的小数字 .

我正在从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它可能有一个评估顺序错误,但我看不到它

1 回答

  • 1

    在大多数具有精确fixnums的实现中,Scheme将尝试在整个执行期间保持这些数字的准确性 . 如果你要分割一些永远不会有精确浮动的东西,比如 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,当你乘以 . 这将迫使结果不准确 .

相关问题