Namespaces
Variants

std:: complex

From cppreference.net
ヘッダーで定義 <complex>
template < class T >
class complex ;
(1)
template <> class complex < float > ;
(2) (C++23まで)
template <> class complex < double > ;
(3) (C++23まで)
template <> class complex < long double > ;
(4) (C++23まで)

cv修飾されていない std::complex の特殊化は、 標準 (C++23まで) 浮動小数点型 に対して、 TriviallyCopyable (C++23以降) LiteralType s であり、 複素数 を表現および操作するためのものです。

目次

テンプレートパラメータ

T - 実数部と虚数部の型。Tがcv修飾されていない 標準 (C++23まで) 浮動小数点型でない場合、動作は未規定(コンパイルが失敗する可能性あり)であり、 T NumericType でない場合、動作は未定義です。

メンバー型

メンバー型 定義
value_type T

メンバー関数

複素数を構築する
(公開メンバ関数)
内容を代入する
(公開メンバ関数)
複素数の実部にアクセスする
(公開メンバ関数)
複素数の虚部にアクセスする
(公開メンバ関数)
2つの複素数、または複素数とスカラーの複合代入
(公開メンバ関数)

非メンバー関数

複素数に単項演算子を適用する
(関数テンプレート)
2つの複素数値、または複素数とスカラーの間で複素数演算を実行する
(関数テンプレート)
(C++20で削除)
2つの複素数、または複素数とスカラーの比較
(関数テンプレート)
複素数をシリアライズおよびデシリアライズする
(関数テンプレート)
std::complex から実部または虚部への参照を取得する
(関数テンプレート)
実部を返す
(関数テンプレート)
虚数部を返す
(関数テンプレート)
複素数の絶対値を返す
(関数テンプレート)
位相角を返す
(関数テンプレート)
二乗絶対値を返す
(関数テンプレート)
複素共役を返す
(関数テンプレート)
(C++11)
リーマン球面上への射影を返す
(関数テンプレート)
大きさと位相角から複素数を構築する
(関数テンプレート)
指数関数
複素数の e を底とする指数関数
(関数テンプレート)
負の実軸に沿った分岐切断を持つ複素自然対数
(関数テンプレート)
負の実軸に沿って分岐切断を持つ複素数の常用対数
(関数テンプレート)
累乗関数
複素数の累乗、1つまたは両方の引数が複素数である可能性があります
(関数テンプレート)
右半平面の範囲における複素数の平方根
(関数テンプレート)
三角関数
複素数の正弦を計算する ( sin(z) )
(関数テンプレート)
複素数の余弦を計算する ( cos(z) )
(関数テンプレート)
複素数の正接を計算する ( tan(z) )
(関数テンプレート)
複素数の逆正弦を計算する ( arcsin(z) )
(関数テンプレート)
複素数の逆余弦を計算する ( arccos(z) )
(関数テンプレート)
複素数の逆正接を計算する ( arctan(z) )
(関数テンプレート)
双曲線関数
複素数の双曲線正弦を計算する ( sinh(z) )
(関数テンプレート)
複素数の双曲線余弦を計算する ( cosh(z) )
(関数テンプレート)
複素数の双曲線正接を計算する ( tanh(z) )
(関数テンプレート)
複素数の双曲線逆正弦を計算する ( arsinh(z) )
(関数テンプレート)
複素数の双曲線逆余弦を計算する ( arcosh(z) )
(関数テンプレート)
複素数の双曲線逆正接を計算する ( artanh(z) )
(関数テンプレート)

ヘルパー型

std::complex のサイズを取得する
(クラステンプレートの特殊化)
std::complex の基となる実数部と虚数部の型を取得する
(クラステンプレートの特殊化)

配列指向アクセス

std::complex<T> 型の任意のオブジェクト z について、 reinterpret_cast < T ( & ) [ 2 ] > ( z ) [ 0 ] z の実部であり、 reinterpret_cast < T ( & ) [ 2 ] > ( z ) [ 1 ] z の虚部である。

std::complex<T> の配列の要素への任意のポインタ p と任意の有効な配列インデックス i について、 reinterpret_cast < T * > ( p ) [ 2 * i ] は複素数 p [ i ] の実部であり、 reinterpret_cast < T * > ( p ) [ 2 * i + 1 ] は複素数 p [ i ] の虚部である。

この要件の意図は、C++ライブラリの複素数型と C言語の複素数型 (およびそれらの配列)との間のバイナリ互換性を維持することです。これらは同一のオブジェクト表現要件を持っています。

実装ノート

配列指向のアクセスの要件を満たすために、実装は std::complex 特殊化の実数部と虚数部を別々かつ隣接するメモリ位置に格納する必要があります。その非静的データメンバーの可能な宣言には以下が含まれます:

  • value_type[2] 型の配列で、最初の要素が実部を、2番目の要素が虚部を保持する(例:Microsoft Visual Studio);
  • value_type _Complex 型の単一メンバー(対応する C言語の複素数型 をカプセル化)(例:GNU libstdc++);
  • value_type 型の2つのメンバーで、同じメンバーアクセス権を持ち、それぞれ実部と虚部を保持する(例:LLVM libc++)。

実装は、実数部と虚数部の記憶域と分離した記憶域を占有する追加の非静的データメンバーを宣言してはならず、また、クラステンプレートの特殊化が パディングビット を含まないことを保証しなければならない。実装はまた、配列アクセスの最適化が、 value_type へのポインタが std::complex の特殊化またはその配列をエイリアシングしている可能性を考慮することを保証しなければならない。

リテラル

インライン名前空間で定義 std::literals::complex_literals
純虚数を表す std::complex リテラル
(関数)

注記

機能テスト マクロ 標準 機能
__cpp_lib_constexpr_complex 201711L (C++20) constexpr <complex> における単純な複素数数学関数
202306L (C++26) <complex> のさらなる constexpr 対応
__cpp_lib_tuple_like 202311L (C++26) std::complex へのタプルプロトコルの追加

#include <cmath>
#include <complex>
#include <iomanip>
#include <iostream>
#include <ranges>
int main()
{
    using namespace std::complex_literals;
    std::cout << std::fixed << std::setprecision(1);
    std::complex<double> z1 = 1i * 1i; // 虚数単位の二乗
    std::cout << "i * i = " << z1 << '\n';
    std::complex<double> z2 = std::pow(1i, 2); // 虚数単位の二乗
    std::cout << "pow(i, 2) = " << z2 << '\n';
    const double PI = std::acos(-1); // または C++20 では std::numbers::pi
    std::complex<double> z3 = std::exp(1i * PI); // オイラーの公式
    std::cout << "exp(i * pi) = " << z3 << '\n';
    std::complex<double> z4 = 1.0 + 2i, z5 = 1.0 - 2i; // 共役複素数
    std::cout << "(1 + 2i) * (1 - 2i) = " << z4 * z5 << '\n';
    const auto zz = {0.0 + 1i, 2.0 + 3i, 4.0 + 5i};
#if __cpp_lib_tuple_like >= 202311L
    for (double re : zz | std::views::keys)
        std::cout << re << ' ';
    std::cout << '\n';
    for (double im : zz | std::views::values)
        std::cout << im << ' ';
    std::cout << '\n';
#else
    for (double re : zz | std::views::transform([](auto z){ return z.real(); }))
        std::cout << re << ' ';
    std::cout << '\n';
    for (double im : zz | std::views::transform([](auto z){ return z.imag(); }))
        std::cout << im << ' ';
    std::cout << '\n';
#endif
}

出力:

i * i = (-1.0,0.0)
pow(i, 2) = (-1.0,0.0)
exp(i * pi) = (-1.0,0.0)
(1 + 2i) * (1 - 2i) = (5.0,0.0)
0.0 2.0 4.0
1.0 3.0 5.0

不具合報告

以下の動作変更の欠陥報告書は、以前に公開されたC++規格に対して遡及的に適用されました。

DR 適用対象 公開時の動作 正しい動作
LWG 387 C++98 std::complex was not guaranteed to be compatible with C complex 互換性が保証される

関連項目

C documentation for Complex number arithmetic
日本語訳:
C documentation for 複素数演算
変更点: - "Complex number arithmetic" → "複素数演算" - HTMLタグ、属性、C++関連用語はそのまま保持 - 書式と構造は完全に維持