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まで) |
std::complexのcv修飾されていない標準(C++23まで)浮動小数点型に対する特殊化は、複素数を表現し操作するためのTriviallyCopyable(C++23から)なLiteralTypeです。
目次 |
[編集] テンプレートパラメータ
| T | - | 実部と虚部の型。Tがcv修飾されていない標準(C++23まで)浮動小数点型でない場合、動作は未規定 (コンパイルに失敗する可能性がある)。TがNumericTypeでない場合、動作は未定義。 |
[編集] メンバ型
| メンバ型 | 定義 |
value_type
|
T
|
[編集] メンバ関数
| 複素数を構築する (公開メンバ関数) | |
| 内容を代入する (公開メンバ関数) | |
| 複素数の実部にアクセスする (公開メンバ関数) | |
| 複素数の虚部にアクセスする (公開メンバ関数) | |
| 2つの複素数、または複素数とスカラ値の複合代入 (公開メンバ関数) |
[編集] 非メンバ関数
| 複素数に単項演算子を適用する (関数テンプレート) | |
| 2つの複素数値、または複素数とスカラ値の複素数演算を実行する (関数テンプレート) | |
| (C++20で削除) |
2つの複素数、または複素数とスカラ値を比較する (関数テンプレート) |
| 複素数をシリアライズ・デシリアライズする (関数テンプレート) | |
| (C++26) |
std::complexから実部または虚部への参照を取得する (関数テンプレート) |
| 実部を返す (関数テンプレート) | |
| 虚部を返す (関数テンプレート) | |
| 複素数の大きさを返す (関数テンプレート) | |
| 偏角を返す (関数テンプレート) | |
| 大きさの2乗を返す (関数テンプレート) | |
| 複素共役を返す (関数テンプレート) | |
| (C++11) |
リーマン球面への射影を返す (関数テンプレート) |
| 大きさと偏角から複素数を構築する (関数テンプレート) | |
指数関数 | |
| 複素数の底eの指数関数 (関数テンプレート) | |
| 複素数の自然対数、分枝切断は負の実軸に沿う (関数テンプレート) | |
| 複素数の常用対数、分枝切断は負の実軸に沿う (関数テンプレート) | |
べき乗関数 | |
| 複素数のべき乗、引数の一方または両方が複素数 (関数テンプレート) | |
| 複素数の平方根、右半平面の範囲 (関数テンプレート) | |
三角関数 | |
| 複素数の正弦 (サイン) を計算する (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)) (関数テンプレート) |
[編集] ヘルパー型
| 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) | <complex> 内の単純な複素数数学関数の constexpr |
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; // imaginary unit squared std::cout << "i * i = " << z1 << '\n'; std::complex<double> z2 = std::pow(1i, 2); // imaginary unit squared std::cout << "pow(i, 2) = " << z2 << '\n'; const double PI = std::acos(-1); // or std::numbers::pi in C++20 std::complex<double> z3 = std::exp(1i * PI); // Euler's formula std::cout << "exp(i * pi) = " << z3 << '\n'; std::complex<double> z4 = 1.0 + 2i, z5 = 1.0 - 2i; // conjugates 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 は C の complex との互換性が保証されていなかった |
互換性が保証された |
[編集] 関連項目
| 複素数演算 のための C ドキュメント
|