はじめに
C++で、数学や物理学、信号処理などの分野で現れる複素数(実部と虚部からなる数)を扱いたい場合、標準ライブラリの <complex>
ヘッダーが非常に役立ちます。
このライブラリは、複素数を表現するための std::complex
クラステンプレートを提供し、四則演算や絶対値、三角関数といった、複素数に関する豊富な数学関数をサポートしています。
この記事では、std::complex
の基本的な使い方を、以下のカテゴリに分けて網羅的に解説します。
- 値の設定と取得
- 基本的な演算
- 複素数用の数学関数
1. 値の設定と取得
std::complex
オブジェクトを生成し、その実部と虚部を設定・取得する方法です。
サンプルコード
#include <iostream>
#include <complex> // complexライブラリ
using namespace std;
int main() {
// 1. コンストラクタで初期化 (実部: 2.5, 虚部: 3.1)
complex<double> c1(2.5, 3.1);
// 2. メンバ関数で設定
complex<double> c2;
c2.real(5.5); // 実部を設定
c2.imag(8.2); // 虚部を設定
// 3. フリー関数で値を取得
cout << "c1 = " << c1 << endl;
cout << "c1の実部: " << real(c1) << ", c1の虚部: " << imag(c1) << endl;
// 4. メンバ関数で値を取得
cout << "c2の実部: " << c2.real() << ", c2の虚部: " << c2.imag() << endl;
return 0;
}
解説:
complex<double>
:double
型をベースにした複素数型を定義します。- 値の設定はコンストラクタや
.real(値)
,.imag(値)
で行います。 - 値の取得は、フリー関数
real(c)
,imag(c)
または、メンバ関数c.real()
,c.imag()
で行えます。
2. 基本的な演算
std::complex
同士の四則演算は、算術演算子(+
, -
, *
, /
)がオーバーロードされているため、自然な形で記述できます。
サンプルコード
#include <iostream>
#include <complex>
using namespace std;
int main() {
complex<double> c1(3.0, 4.0);
complex<double> c2(2.0, 1.0);
cout << "c1 = " << c1 << endl;
cout << "c2 = " << c2 << endl;
cout << "--- 四則演算 ---" << endl;
cout << "c1 + c2 = " << c1 + c2 << endl;
cout << "c1 - c2 = " << c1 - c2 << endl;
cout << "c1 * c2 = " << c1 * c2 << endl;
cout << "c1 / c2 = " << c1 / c2 << endl;
// 複合代入演算子も利用可能
c1 += c2;
cout << "c1 += c2 -> c1 = " << c1 << endl;
return 0;
}
解説: (3+4i) + (2+i) = (5+5i)
のような複素数の計算が、c1 + c2
と書くだけで正しく行われます。
3. 複素数用の数学関数
<complex>
ヘッダーには、複素数に特化した様々な数学関数も用意されています。
サンプルコード
#include <iostream>
#include <complex>
using namespace std;
int main() {
complex<double> c(-3.0, 4.0);
cout << "c = " << c << endl;
// abs: 絶対値(原点からの距離)
cout << "絶対値 (abs): " << abs(c) << endl; // sqrt((-3)^2 + 4^2) = 5
// arg: 偏角(ラジアン)
cout << "偏角 (arg): " << arg(c) << endl;
// norm: ノルム(絶対値の2乗)
cout << "ノルム (norm): " << norm(c) << endl; // (-3)^2 + 4^2 = 25
// conj: 共役複素数(虚部の符号を反転)
cout << "共役 (conj): " << conj(c) << endl; // (-3.0, -4.0)
// cos, sin, exp などの標準的な数学関数もオーバーロードされている
cout << "cos(c): " << cos(c) << endl;
return 0;
}
complex
リテラル (C++14)
C++14以降では、using namespace std::complex_literals;
を宣言することで、1.0i
のように虚数を直感的に記述できるリテラルが使えます。
#include <iostream>
#include <complex>
using namespace std;
using namespace std::complex_literals; // リテラルを有効化
int main() {
auto c1 = 3.0 + 4.0i; // (3.0, 4.0)
auto c2 = 1.0i * 1.0i; // (0.0, 1.0) * (0.0, 1.0) = -1
cout << c1 << endl;
cout << c2 << endl;
return 0;
}
まとめ
今回は、C++の <complex>
ライブラリを使って、複素数を扱う基本的な方法を解説しました。std::complex
を使うことで、複素数の計算を、まるで組み込みの数値型のように、自然で直感的なコードで記述することができます。