ight:500px;width: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
疑惑的是更大的数没有卡住,小一点的反而算不出来?这是?