SICPを読む(8) 1.1.8 ブラックボックス抽象としての手続き。

要するに、隠蔽って事だね。

Javaでいう所の、privateで定義しよう!みたいなお話し。

ところで、expってなんだっけ?

気になる1文がある。

(define (square x) (* x x))
(square 2) ; 4

2の2乗は4だ。

そこまではわかる。

問題は次だ。

(define (square x)
 (exp (double (log x))))
(define (double x) (+ x x))
(square 2) ; 4.0

2乗を再定義して、ブラックボックスの解説をしているのだが、

expとlogってなんだっけ?

そうそう、自然対数、指数関数・・・うっはぁ・・・完全に忘却の彼方だ・・・。

本棚を漁ったら、良い本があった。1年程前に買った本がようやく役立つ日がやってきた。

プログラマの数学

プログラマの数学

重要なのは「対数で掛け算を足し算に出来る」ってところ。残念ながら、自然対数と指数関数については書いてなかったが、対数の理解を深めることが出来た。激しくお勧めの本。

自然対数、指数関数を使うと、近似値だが、指数的爆発を抑えることができる。

指数関数expについては深追いすると大変な事になりそうな予感がするので飛ばす。

数学がちょっと面白くなってきた。

参考

ムズいので、結城さんの本を買おう!

% gnuplot
gnuplot> plot exp(log(x) + log(x))

gnuplotがわかりやすい。

束縛

Schemeな人々は難しい言葉をよく使う。そのひとつが「束縛」。束縛ってなんだぁ!!

・・・意味がよくわからないので、調べた。

Scheme プログラミング人門 - じんもんって・・・。

Scheme では変数に値を定義することを「束縛 (binding)」と呼びます」

素晴らしい。グレイトな解説。

定義された変数の事を、「束縛変数(bound variable)」という。

スコープについて

xはsqrtに束縛されている。xは固定の値なので使いまわすことが出来る。

(define (sqrt x)
  (define (improve guess)
    (average guess (/ x guess)))
  (define (good-enough? guess)
    (< (abs (- (square guess) x)) (/ guess 1000)))
  (define (sqrt-iter guess)
    (if (good-enough? guess)
      guess
      (sqrt-iter (improve guess))))
  (sqrt-iter 1.0))

随分省略できたが、判り難くなった気がする。

追記

こんな公式あったな。

log a ^ n = n log a