SICPを読む(82) 2.4 抽象データの多重表現

抽象データの多重表現に入ります。しばらく淡々と説明が続く。

テーマが「複素数」というのが泣ける。相当苦しい章になりそうだ。

複素数の表現

  • ずっと前にやった有理数(分数)表現と同じような感じ。
  • しかし、今回は事情が違う。直行座標形式と、極座標形式という、複素数表現の実装方法を2種類持ってる事。
  • 激しく困る問題は、どちらのデータ型も複素数を表現していて、複素数パッケージを2種類使いたいという悩みだ。

Cで表すと、こんな状態。

struct complex {
    double real;
    double imag;
};

struct complex {
    double magnitude;
    double angle;
};

えぇぇぇ・・・ダメじゃん。

この問題をどう解決していくんだろうというのが今回のテーマらしい。


楽しみ半分。複素数嫌だな。ってのが半分。


とりあえず複素平面の勉強から・・・。

Gaucheのmath.constの真似

MzSchemeだと、math.ssにpiが定義してあるけど、piだけじゃ面白くないので、Gaucheのmath.constの真似をして色々追加してみた。

(define pi (atan 0.0 -1.0)) ; 3.141592653589793
(define (*pi x) (* x pi))
(define pi/6  (*pi 1/6)) ; 0.5235987755982988
(define pi/4  (*pi 1/4)) ; 0.7853981633974483
(define pi/3  (*pi 1/3)) ; 1.0471975511965976
(define pi/2  (*pi 1/2)) ; 1.5707963267948966
(define pi2/3 (*pi 2/3)) ; 2.0943951023931953
(define pi3/4 (*pi 3/4)) ; 2.356194490192345
(define pi5/6 (*pi 5/6)) ; 2.617993877991494

(define (/pi x) (/ x pi))
(/pi pi/2) ; 0.5
(/pi pi/4) ; 0.25

半分書いた所で疲れた。とりあえず半分あればいいや。