【问题标题】:Why is my cubic root algorithm wrong? Exercise 1.8 in SICP为什么我的三次根算法是错误的? SICP中的练习1.8
【发布时间】:2017-01-05 13:56:15
【问题描述】:

> 固定,

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

我正在通过 SICP 和 Scheme 的解释器做练习 1.8 ̵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 它可能有评估顺序错误,但我看不到它

【问题讨论】:

  • 是否有特定的输入导致您的算法冻结?
  • (improve 1000) 产生 334,但运行整个算法 (cubert 1000) 冻结它可能有无限循环或评估顺序错误,但我看不到它
  • 那(cubert 1000.0)呢?
  • 已修复,它不是一个巨大的数字,而是两个巨大数字的一小部分,所以是误报。算法是对的;现在修改最后一个输入参数,解释器将其检索为十进制逗号,看起来就像它一直以来的小数字。

标签: algorithm scheme evaluation sicp mit-scheme


【解决方案1】:

在大多数具有精确固定编号的实现中,方案将在整个执行过程中尝试保持这些数字精确。如果您要对永远无法精确浮点数的东西进行除法,例如1 除以3

(/ 1 3)
; ==> 1/3

您会得到准确的值1/3(cubert 27) 的结果完全是 fixnum 操作,所以它也会产生分数结果:

(cubert 27)
; ==> 3 5164693972157389706641814378288819200000000/10804364367444398305386468912180491314165089

如果你想要一个不太精确的数字,比如浮点数,你可以从一个不精确的值开始强制它,或者你可以在之后使用exact-&gt;inexact 转换精确的结果:

(cubert #i27)                ; ==> 3.48
(exact->inexact (cubert 27)) ; ==> 3.48

您也可以在算法中使用不精确的2 强制它,即。 #i2 或 `2.02,当你乘法时。这将导致结果不准确。

【讨论】:

    猜你喜欢
    • 2020-09-30
    • 2010-11-13
    • 1970-01-01
    • 2012-07-05
    • 2011-11-05
    • 2017-02-03
    • 2010-12-26
    • 2012-12-15
    • 2021-05-23
    相关资源
    最近更新 更多