【C++】std::complex の使い方 | 複素数を扱うための基本ガイド

目次

はじめに

C++で、数学や物理学、信号処理などの分野で現れる複素数(実部と虚部からなる数)を扱いたい場合、標準ライブラリの <complex> ヘッダーが非常に役立ちます。

このライブラリは、複素数を表現するための std::complex クラステンプレートを提供し、四則演算や絶対値、三角関数といった、複素数に関する豊富な数学関数をサポートしています。

この記事では、std::complex の基本的な使い方を、以下のカテゴリに分けて網羅的に解説します。

  1. 値の設定と取得
  2. 基本的な演算
  3. 複素数用の数学関数

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 を使うことで、複素数の計算を、まるで組み込みの数値型のように、自然で直感的なコードで記述することができます。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次