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
#includeusing namespace std;
void main(void) {
complexa = complex (1.4, 2.0);
cout << exp(a) << endl; // (-1.68756,3.68738)
}
これらをDでも使えるようにしていく。