本投稿の目的
Structure and Interpretation of Computer Programsを読み始めて二日目。
毎日ログをつけなければサボると思い、日記程度にまとめます。DS勉強してました。Pythonしか書けないです。(書けるといっても、Vibe Coding勢。)(著者はあまりどっぷり何かに浸かったことがない人間。)
〜P25まで終わった。なんかまだ見にくいなーと言う感想
気づいたこと
- これ入れ子にしているだけでPythonと変わらないのでは?
- 適用順序評価:引数を先に全部評価するので、引数から読んでく(基本のschema)
- 正規順序評価:必要になるまで引数を評価しないので、前から読んでく(ifとか)
- 1.1.7むずすぎる。。。
練習問題1.1.7
平⽅根の計算に使った good-enough? テストは、と
ても⼩さい数値の平⽅根を求めるのにはあまり効率的ではないだ
ろう。また、実際のコンピュータでは、数値演算はほとんど必ず有
限の有効数字で⾏われることになる。この問題があるので、とて
も⼤きい数に対しては、我々のテストは不適切なものになる。こ
れらの⾔明について、⼩さい数と⼤きい数でテストがうまくいか
ない例を使って説明せよ。good-enough? を実装するためのもうひ
とつの戦略としては、guess が繰り返しごとにどれだけ変化する
かを確認して、差分が推定値に対してとても⼩さいものになった
ら⽌めるというものもある。これは、⼩さい数値や⼤きい数値に
対して、よりうまくいくだろうか。
Qiitaにもわかりやすい解答例がなく、ぴえんです。
とりあえず、Q1のうまくいかない例は、なんとなくトライしてみました。
結論、なんかの閾値を超えると、だんだん精度が悪くなっていくのかなと(線形的にか指数関数的にかはわからないですが。)
# 小さい数の例
## expectation 0.1
scheme@(guile-user)> (sqrt 0.01)
$1 = 0.10032578510960605
## expectation 0.01 ちょっと違くね?笑
scheme@(guile-user)> (sqrt 0.0001)
$2 = 0.03230844833048122
# 大きい数の例
## なんか長くて怖くなってぶっちぎった。
scheme@(guile-user)> (sqrt 200000000000000000000)
ice-9/boot-9.scm:1705:22: In procedure raise-exception:
User interrupt
大きい数
要は、徐々に(define (improve guess x) (average guess (/ x guess)))(guessは初期値1.0)を実行してguessをアップデートして行ったとしても、変化量が小さすぎる浮動小数点の切り捨て(保存メモリが少なめ)によって、前イテレーションと同じ値になってしまい、good-enough?が#f(Lispぽく)になってしまうそうです。(素人まとめ)
→Pythonではこんな悩みを全く気にしたことがないです。メモリって発展してるんですか?笑。
小さい数
眠いんで寝させてください。明日朝勉強して記載したい。
改善案
以下同文
(参考:https://sicp-solutions.net/post/sicp-solution-exercise-1-7/)
→意外と優しい英語で読みやすい