sicp 练习1.8 【有点疑惑】

ight:500px;100%;">

;cubeRoot函数只适用于x是正数时,负数时是在m函数中处理的。
(define (cubeRoot x guess)
  ;x除以两次guess,得到result,(要是result等于guess,那么这个guess就是最结果了)
  (define result (/  x  
                    guess
                    guess )
    )
  
  ;improve函数将近似值变得更精确,当符合精度要求是返回0,以提示结束计算
  (define (improve x y)
    (define newY (/(+ (/ x 
                         (* y y)) 
                      (* 2 y))
                   3)
      )
    (if (< (abs(- y 
                  newY)  
               )
           0.000000000000001  ;精度15位,再多几位会算死机
           )
        0
        newY
        )
    )
  
  ;猜测数不是结果时,改进猜测数,这个函数简单的求两者中值
  (define (updateGuess guess result)
    (/(+ guess 
         result)
      2
      )
    )
  
   (define (goodEnough? guess)
    ;封装improve函数,方便使用,并且减少一次无为调用
    (define improveGuess (improve  x guess)
      )
    (if (= 0 improveGuess);约等以后继续计算更精确的值,当精确度达到一定程度以后,improveGuess返回0,以此结束运算
        guess
        (cubeRoot x improveGuess )
        )
    )
  ;以下是执行代码。 
  (if (<(abs(- guess 
               result))   ;判断结果是否和猜测值约等
        0.0001)
      (goodEnough? guess)
      (cubeRoot x (updateGuess guess result) )
      )
    

  )

;封装方法,并处理负数情况
(define (m x)    
    (define lastResult
       (cubeRoot  x 2.0);从2.0开始
      )
      
    (if (< x 0)   ;当x是负数时,结果加上负号.因为负数三次方根只要在它的正数的三次方根的结果上加负号
      (- 0 lastResult);得到负数
      lastResult
      )
 
  )
;mst(mistake)函数测试误差有多少
(define (mst x) 
  (define result (m x))
  (-  (* result result result) x)
  )
 

> (m 99999999)
464.15888181408155

> (mst 99999999)
-2.9802322387695313e-008

> (mst 99999999)

-2.9802322387695313e-008   ;上面计算结果偏小了
> (m 9999999)  ;卡住了
. . user break

疑惑的是更大的数没有卡住,小一点的反而算不出来?这是?

原文地址:https://www.cnblogs.com/jiangzhen/p/1666167.html