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 移除)
比较两个复数,或一个复数与一个标量
(函数模板) [编辑]
复数的序列化和反序列化
(函数模板) [编辑]
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 的虚部。

对于任何指向 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
__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. + 2i, z5 = 1. - 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++ 标准。

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

[编辑] 参阅

复数算术C 文档