Hatena::Groupsicp

yharaの日記

参考リンク

2007-05-03

[].7 21:02

「差が0.001以下」で判定すると、

  1. 非常に小さい数の平方根を取ると、必ず1回目で再帰が終わる
  2. 非常に大きい数の平方根を取ると、差がなかなか収束しなくなる

という問題がありそう。

sqrt-iterデバッグプリントを仕込んで実験してみる。

1.7.scm

(define (sqrt-iter guess x)
  (print #`"sort-iter: ,guess ,x")
  (if (good-enough? guess x)
      guess
      (sqrt-iter (improve guess x)
                 x)))
;あとは1.6.scmといっしょ

非常に小さい数のsqrtを求めるとどうなるか。

yhara@meteor:~/src/sicp % gosh
gosh> (load "./1.7.scm")
#t
gosh> (sqrt 0.000000001)
sort-iter: 1.0 1.0e-9
sort-iter: 0.5000000005 1.0e-9
sort-iter: 0.25000000125 1.0e-9
sort-iter: 0.125000002625 1.0e-9
sort-iter: 0.06250000531249991 1.0e-9
sort-iter: 0.03125001065624928 1.0e-9
0.03125001065624928
gosh>

√0.000000001 が 0.03 に^^;

しかし「再帰が1回~」は嘘だったな。「近似の精度が落ちる」が正解か。

今度は大きい方。

gosh> (sqrt 100000000)
sort-iter: 1.0 100000000
sort-iter: 50000000.5 100000000
sort-iter: 25000001.24999999 100000000
sort-iter: 12500002.624999894 100000000
sort-iter: 6250005.312499107 100000000
sort-iter: 3125010.6562427534 100000000
sort-iter: 1562521.328066817 100000000
sort-iter: 781292.6635966157 100000000
sort-iter: 390710.3283034968 100000000
sort-iter: 195483.13619747627 100000000
sort-iter: 97997.34463768976 100000000
sort-iter: 49508.89022510405 100000000
sort-iter: 25764.364740575656 100000000
sort-iter: 14822.847335384222 100000000
sort-iter: 10784.594750729779 100000000
sort-iter: 10028.540197249 100000000
sort-iter: 10000.040611237677 100000000
sort-iter: 10000.000000082462 100000000
sort-iter: 10000.0 100000000

うーん、収束が遅い…とは言えないか?

続きはあとで書く

ChristianaChristiana2012/01/10 09:33That's more than snebsile! That's a great post!

sgiodkkfjgssgiodkkfjgs2012/01/10 19:14Gv8tkW <a href="http://cjqpfjauqswr.com/">cjqpfjauqswr</a>

ntfhyvcwntfhyvcw2012/01/12 22:54TKFix7 <a href="http://egvshzpudncy.com/">egvshzpudncy</a>