## 20.2 複素数の作成と使用

以降の節では、複素数の作成と操作に使用される演算について説明します。

### 20.2.1 複素数の宣言

テンプレート引数は、実数フィールドと虚数フィールドに関連する型定義に使用されます。この引数は、C++ 言語で使用可能な浮動小数点数データ型である `float`、`double`、`long` `double` のいずれかである必要があります。

このクラスに関連するいくつかのコンストラクタがあります。引数のないコンストラクタは、実数フィールドと虚数フィールドの両方をゼロに初期化します。単一引数を取るコンストラクタは、実数フィールドを特定の値に、虚数フィールドをゼロに初期化します。2 つの引数を取るコンストラクタは、実数フィールドと虚数フィールドの両方を初期化します。コピーコンストラクタを使用すると、複素数を別の複素数から派生した値で初期化することができます。

    complex<double> com_one;              // 値 0 + 0i
    complex<double> com_two(3.14);        // 値 3.14 + 0i
    complex<double> com_three(1.5, 3.14)  // 値 1.5 + 3.14i
    complex<double> com_four(com_two);    // 値はやはり 3.14 + 0i

複素数には、別の複素数の値を代入することができます。単一引数を取るコンストラクタは変換演算子にも使用できるため、複素数には実数値を代入することもできます。実数フィールドは右辺に変更され、虚数フィールドはゼロに設定されます。

    com_one = com_three;                   // 1.5 + 3.14i になる
    com_three = 2.17;                      // 2.17 + 0i になる

関数 `polar()` を使用して、一定の量と位相角を使用して複素数を作成することができます。

    com_four = polar(5.6, 1.8);

共役複素数は、関数 `conj()` を使用して作成されます。複素数が `x + iy` を表す場合、共役複素数は値 `x - iy` を表します。

    complex<double> com_five = conj(com_four);

### 20.2.2 複素数値へのアクセス

メンバー関数 `real()` および `imag()` は、それぞれ複素数の実数フィールドと虚数フィールドを返します。これらの関数は、複素数の引数を取る通常の関数としても呼び出すことができます。

    // 以下の 2 つの結果は同じである
    cout << com_one.real() << "+" << com_one.imag() << "i" << endl;
    cout << real(com_one) << "+" << imag(com_one) << "i" << endl;

> 注 : メンバー関数 `real()` と `imag()` を例外として、複素数のほとんどの演算は、メンバー関数ではなく通常の関数を使用して実行されます。

### 20.2.3 算術演算

算術演算子 `+`、`-`、`*`、`/` を使用して、複素数の加算、減算、乗算、除算を実行することができます。4 つの演算子はすべて、2 つの複素数、および複素数と実数値に適用することができます。また、この 4 つすべてに代入演算子を定義することもできます。

    cout << com_one + com_two << endl;
    cout << com_one - 3.14 << endl;
    cout << 2.75 * com_two << endl;
    com_one += com_three / 2.0;

単項演算子 `+` と `-` は複素数に適用することもできます。

### 20.2.4 複素数値の比較

演算子 `==` と `!=` を使用して、2 つの複素数の等価または不等価を比較することができます。対応するフィールドが等しければ、2 つの値は等価です。複素数は適切に順序付けされないため、他の関係演算子を使用して比較することはできません。

### 20.2.5 入出力ストリーム

通常のストリーム I/O 規約を使用して、複素数を出力ストリームに書き込んだり、入力ストリームから読み取ることができます。値は、虚数値がゼロかどうかによって、`(u)` や `(u,v)` のように括弧の中に書き込まれます。値は、2 つの数値を囲む 1 対の括弧として読み取られます。

### 20.2.6 ノルムと絶対値

関数 `norm()` は、複素数のノルムを返します。これは、実数部と虚数部の平方の合計です。関数 `abs()` は、ノルムの平方根である絶対値を返します。複素数値を引数に使用するのはいすれも通常の関数であり、メンバー関数ではないことに注意してください。

    cout << norm(com_two) << endl;
    cout << abs(com_two) << endl;

複素数の有向位相角は、関数 `arg()` によって算出されます。

    cout << com_four << " in polar coordinates is "
       << arg(com_four) << " and " << norm(com_four) << endl;

### 20.2.7 三角関数

浮動小数点値に定義された三角関数は、すべて引数に複素数を使用できるように拡張されました。これらの関数は `sin()`、`cos()`、`tan()`、`sinh()`、 `cosh()`、`tanh()` です。それぞれ単一の複素数を引数として使用し、結果として複素数を返します。

### 20.2.8 超越関数

超越関数 `exp()`、`log()`、`log10()`、`sqrt()` は、引数に複素数を使用できるように拡張されました。それぞれ単一の複素数を引数として使用し、結果として複素数を返します。

標準 C++ ライブラリでは、指数関数 `pow()` のバリエーションをいくつか定義しています。 複素数を整数でべき乗するもの、複素数を複素数や実数でべき乗するもの、実数値を複素数でべき乗するものなどがあります。

Copyright (c) 1998, Rogue Wave Software, Inc.
このマニュアルに関する誤りのご指摘やご質問は、電子メールにてお送りください。
OEM リリース, 1998 年 6 月