C言語で複素数を扱う

Numerical Recipesをはじめ、色んなところで、C言語では複素数をサポートしてないので、実部と虚部を構造体のメンバにして、そいつらの間の計算の規則を云々とか書いてあるわけだが、そんなダサダサなことしないで、人様の作ったパッケージを使った方が良いに決まってる。なんつーか自前じゃ所詮自前程度のものしか出来ないわけで。パッケージ化されてるものは既にそこまで洗練されているからそういうパッケージになってるわけで。っつーことで、C言語複素数使うときはcomplex.hを使います。

http://www.alab.t.u-tokyo.ac.jp/~bond/doc/complex.html

何か変数の定義は、C++のときとは若干違うみたい。C++のときはあからさまに構造体のメンバみたいな感じだったけど、Cのcomplex.hを使う場合は、double型と、int型の場合それぞれ、

double _Complex z1;
int _Complex a;

となり、それぞれに値を代入する場合は、iは実数精度の数値の虚数単位で、Iが整数精度の虚数単位で、

z1 = 1.0 + 1.5*i;
a = 1 + 1*I;

とかなるらしい。
で、このヘッダはビルドインされているので、別にincludeしなくても使えちゃうらしい。上のサイトにあったサンプルを持ってきてコンパイルして実行したらちゃんと正しい値が出たし。
っつーことで、これからC++からCへの移植をしますよ。そしてLAPACKの使い方を覚えます。何だかやることが盛り沢山です。


色々とサンプルを改造したりしたわけだけど、どうやら虚数はIにしても良いみたいですね。iにするとこれってば一般的な整数と混同するから分かりにくいですね。僕はiをdummy suffixに使ってるんで、虚数単位はIにしておきたかった感じです。
そして、このcomplex.hの何がすげーって、本当に人間が演算するのと同じ感じで複素数の計算が出来るのが凄いです。例えば、複素数zの実部をx、虚部をy、虚数単位をIとすると、

z = x + yI;

ってするだけで良いのですね。
C++のcomplex.hでは、

z = complex <double> (x, y);

ってしてたのがより自然な形で書き下すことが可能になります。が、その分その他の記号と混同することもあるかもしれないので若干注意が必要です。
でもなあ、やっぱstdioよりもiostreamの方が出力についてはスマートな感じがするから、本音ではC++を使いたいんだよなあ。でもそれには線形代数パッケージの問題でと。まあ痛し痒しといったところですね。