命名空间
变体
操作

std::complex

来自 cppreference.com
< cpp‎ | numeric
 
 
 
 
在头文件 <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 起) LiteralTypes,用于表示和操作 复数.

内容

[编辑] 模板参数

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字面量
(函数) [编辑]

[编辑] 说明

功能测试 Std 功能
__cpp_lib_constexpr_complex 201711L (C++20) constexpr <complex> 中的简单复数数学函数
202306L (C++26) 更多 constexpr 用于 <complex>
__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 文档 关于 复数算术