SICP問題1.7
まだ実験してないが、
http://d.hatena.ne.jp/xiombatsg/20060626#p1
のgood-enoughで
値が非常に大きいか小さいかする時にうまく動作しないことがあるのは
そもそも、
(< (abs (- (square y) x)) 0.0001)
の
(abs (- (square y) x))
に問題がある。これは計算精度の問題だが、
x,yの値の差があまりにも大きい場合、
(= (abs (- (square y) x)) x)
もしくは
(= (abs (- (square y) x)) y)
となりえる。
そのため、再帰のループが発生し、正常に動作しない。
また、good-enoughの別のアプローチだが、
次のyの変化がある程度小さくなった時に止めるようにするには、
こんな感じかな?
(< (abs (- (improve y x) y)) 0.0001)
1step早く計算が終わるが、0.0001の部分を小さくしてとっておけば許容範囲内の誤差に収まるだろう。