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 ;上面计算结果偏小了
> (m 9999999) ;卡住了
. . user break
疑惑的是更大的数没有卡住,小一点的反而算不出来?这是?