2008年9月16日火曜日

計算機プログラムの構造と解釈 問題1.7


このエントリーをはてなブックマークに追加



非常に大きいxや、小さいxに対して、平方根をとる場合の対策。
(大きすぎる値は無限ループになる)
(平方根に近づいていく)予測値guessの次の予測値との差をとる。
このときしきい値をguess*0.001と、guessを基準にして相対値で比較しないと、非常に小さい数に対応できない。



(define (sqrt-iter guess x)
(print guess)
(if (good-enough? guess x)
guess
(sqrt-iter (improve guess x) x)))


(define (good-enough? guess x)
( < (abs (- guess (improve guess x) )) (* guess 0.001)))




追記
(if (good-enough? guess x)

(if (good-enough? guess (improve guess x))
にして、
(define (good-enough? guess x)
( < (abs (- guess (improve guess x) )) (* guess 0.001)))

(define (good-enough? guess next-guess)
( < (abs (- guess next-guess )) (* guess 0.001)))
にしたほうが解りやすいか。

こういう配慮が上手くできるようになりたいなぁ。



(define (sqrt-iter guess x)
(print guess)
(if (good-enough? guess x);(if (good-enough? guess (improve guess x))
guess
(sqrt-iter (improve guess x) x)))


(define (good-enough? guess x);(define (good-enough? guess next-guess)
( < (abs (- guess (improve guess x) )) (* guess 0.001)));( < (abs (- guess next-guess )) (* guess 0.001)))





0 件のコメント:

コメントを投稿