名稱空間
變體
操作

std::complex

來自 cppreference.com
< cpp‎ | 數值
 
 
 
 
定義於標頭檔案 <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

[編輯] 成員函式

構造一個複數
(公共成員函式) [編輯]
賦值內容
(公共成員函式) [編輯]
訪問複數的實部
(公共成員函式) [編輯]
訪問複數的虛部
(公共成員函式) [編輯]
兩個複數或一個複數和一個標量的複合賦值
(公共成員函式) [編輯]

[編輯] 非成員函式

對複數應用一元運算子
(函式模板) [編輯]
對兩個複數值或一個複數和一個標量執行復數算術
(函式模板) [編輯]
(在 C++20 中移除)
比較兩個複數或一個複數和一個標量
(函式模板) [編輯]
序列化和反序列化複數
(函式模板) [編輯]
std::complex 獲取實部或虛部的引用
(函式模板) [編輯]
返回實部
(函式模板) [編輯]
返回虛部
(函式模板) [編輯]
返回複數的模
(函式模板) [編輯]
返回相角
(函式模板) [編輯]
返回模的平方
(函式模板) [編輯]
返回複共軛
(函式模板) [編輯]
(C++11)
返回到黎曼球面的投影
(函式模板) [編輯]
從模和相角構造一個複數
(函式模板) [編輯]
指數函式
複數 e 的指數
(函式模板) [編輯]
具有沿負實軸分支割線的複數自然對數
(函式模板) [編輯]
具有沿負實軸分支割線的複數常用對數
(函式模板) [編輯]
冪函式
複數冪,一個或兩個引數可以是複數
(函式模板) [編輯]
右半平面範圍內的復平方根
(函式模板) [編輯]
三角函式
計算複數的正弦 (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> 的任何物件 zreinterpret_cast<T(&)[2]>(z)[0]z 的實部,reinterpret_cast<T(&)[2]>(z)[1]z 的虛部。

對於名為 pstd::complex<T> 陣列元素的任何指標和任何有效陣列索引 ireinterpret_cast<T*>(p)[2 * i] 是複數 p[i] 的實部,而 reinterpret_cast<T*>(p)[2 * i + 1] 是複數 p[i] 的虛部。

此要求的目的是為了保持 C++ 庫複數型別與 C 語言複數型別(及其陣列)之間的二進位制相容性,它們具有相同的物件表示要求。

[編輯] 實現說明

為了滿足面向陣列訪問的要求,實現必須將 std::complex 特化版本的實部和虛部儲存在獨立且相鄰的記憶體位置。其非靜態資料成員的可能宣告包括:

  • 型別為 value_type[2] 的陣列,其中第一個元素儲存實部,第二個元素儲存虛部(例如 Microsoft Visual Studio);
  • 型別為 value_type _Complex 的單個成員(封裝對應的 C 語言複數型別)(例如 GNU libstdc++);
  • 型別為 value_type 的兩個成員,具有相同的成員訪問許可權,分別儲存實部和虛部(例如 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 新增 tuple 協議

[編輯] 示例

#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++ 標準。

缺陷報告 應用於 釋出時的行為 正確的行為
LWG 387 C++98 std::complex 不保證與 C complex 相容 保證相容

[編輯] 另請參閱

C 文件 關於 複數算術