複素数(1)

DではC/C++より簡単に複素数を扱える。


import std.cstream;

void main(char[][] args) {
cdouble c = 1 + 2i;
dout.writefln(c); // 1+2i

// cdouble d = 1 + i; // これはダメ
cdouble d = 1 + 1i;
dout.writefln(d); // 1+1i

cdouble e = 1.4 + 2i;
cdouble f = 0.21 - 0.3i;
dout.writefln(e * f); // 0.894+2.66443e-17i

// dout.writefln(exp(e)); // 複素数のexpの定義はない
}

複素数の型には、cfloat, cdouble, crealがある。
また、虚数型として、ifloat, idouble, irealがある。


最初の例にあるように、
複素数を簡単で自然なリテラルで表せる。


2番目にあるように、さすがに「1 + i」とは表せない。
「i」は識別子と解釈されてしまう。
このような場合は、やや不自然だが「1 + 1i」とする。


3番目はいじわるな例。
2つの複素数の積を取ると数学的には実数となるが、
浮動小数点数なので誤差が出て、
虚部に小さな数字が残る。
実部が大きいので無視してほしいのが人情だが、
それはやはり出力しても残ってしまう。


最後はこれからやっていく課題。
expだけではなく、
std.mathに定義されたあらゆる数学関数で複素数が使えない。
C++は次のようになる。


#include
#include
#include

using namespace std;

void main(void) {
complex a = complex(1.4, 2.0);
cout << exp(a) << endl; // (-1.68756,3.68738)
}

これらをDでも使えるようにしていく。