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