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 起)字面类型 (LiteralType)

模板形参

T - 实部和虚部的类型。T 不是无 cv 限定的标准 (C++23 前)浮点类型时行为未指定(编译可能会失败),而且 T 不是数值类型 (NumericType) 时行为未定义。

成员类型

成员类型 定义
value_type T

成员函数

构造一个复数
(公开成员函数)
赋值内容
(公开成员函数)
访问复数的实部
(公开成员函数)
访问复数的虚部
(公开成员函数)
两个复数,或一个复数与一个标量的复合赋值
(公开成员函数)

非成员函数

对复数运用一元运算符
(函数模板)
在两个复数,或一个复数与一个标量上进行复数算术运算
(函数模板)
(C++20 中移除)
比较两个复数,或一个复数与一个标量
(函数模板)
复数的序列化和反序列化
(函数模板)
返回实部
(函数模板)
返回虚部
(函数模板)
返回复数的模
(函数模板)
返回辐角
(函数模板)
返回模(范数)的平方
(函数模板)
返回复共轭
(函数模板)
(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<T> 类型的对象 zreinterpret_cast<T(&)[2]>(z)[0]z 的实部,reinterpret_cast<T(&)[2]>(z)[1]z 的虚部。

对于任何指向 complex<T> 数组元素的指针 p 及任何合法下标 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

示例

#include <iostream>
#include <iomanip>
#include <complex>
#include <cmath>
 
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. + 2i, z5 = 1. - 2i; // 共轭
    std::cout << "(1 + 2i) * (1 - 2i) = " << z4 * z5 << '\n';
}

输出:

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)

缺陷报告

下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。

缺陷报告 应用于 出版时的行为 正确行为
LWG 387 C++98 std::complex 不保证与 C 语言的 complex 兼容 保证兼容

参阅