std::complex

来自cppreference.com
< cpp‎ | numeric
定义于头文件 <complex>
template< class T >
class complex;
(1)
template<> class complex<float>;
(2)
template<> class complex<double>;
(3)
template<> class complex<long double>;
(4)

模板特化 std::complex<float>std::complex<double>std::complex<long double> 是表示并计算复数字面类型 (LiteralType)

对任何其他类型,实例化模板 complex 的效果是不确定的。

成员类型

 
成员类型 定义
value_type T

成员函数

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

非成员函数

对复数运用一元运算符
(函数模板)
在两个复数,或一个复数与一个标量上进行复数算术运算
(函数模板)
比较两个复数,或一个复数与一个标量
(函数模板)
复数的序列化和反序列化
(函数模板)
返回实部
(函数模板)
返回虚部
(函数模板)
返回复数的模
(函数模板)
返回辐角
(函数模板)
返回模(范数)的平方
(函数模板)
返回复共轭
(函数模板)
(C++11)
返回到黎曼球上的投影
(函数模板)
从模和辐角构造复数
(函数模板)
指数函数
e 为底复数的指数
(函数模板)
沿负实轴切割的复自然对数
(函数模板)
沿负实轴分割的复常用对数
(函数模板)
幂函数
复数幂,一或两个参数可为复数
(函数模板)
右半平面范围中的复平方根
(函数模板)
三角函数
计算复数的正弦(sin(z)
(函数模板)
计算复数的余弦(cos(z)
(函数模板)
计算复数的正切(tan(z)
(函数模板)
计算复数的反正弦(arcsin(z)
(函数模板)
计算复数的反余弦(arccos(z)
(函数模板)
计算复数的反正切(arctan(z)
(函数模板)
双曲函数
计算复数的双曲正弦(sh(z)
(函数模板)
计算复数的双曲余弦(ch(z)
(函数模板)
计算复数的双曲正切
(函数模板)
计算复数的反双曲正弦
(函数模板)
计算复数的反双曲余弦
(函数模板)
计算复数的反双曲正切
(函数模板)

通过数组访问

对于任何 complex<T> 类型的对象 zreinterpret_cast<T(&)[2]>(z)[0] 为 z 的实部且 reinterpret_cast<T(&)[2]>(z)[1] 为 z 的虚部。

对于任何名为 p 指向 complex<T> 数组元素的指针,及任何合法下标 ireinterpret_cast<T*>(p)[2*i] 等于复数 p[i] 的实部,而 reinterpret_cast<T*>(p)[2*i + 1] 等于复数 p[i] 的虚部

此要求的目的是 C++ 复数类型与 C 语言复数类型(及其数组)的二进制兼容性,其中要求相同的对象表示。

(C++11 起)

实现注解

为满足数组访问的要求,实现需满足在单独且相邻的内存位置存储 std::complex 特化的实部和虚部。其非静态数据成员的可能声明包括:

  • 数组类型 value_type[2] ,其首元素存有实部而第二元素存有虚部(例如 Microsoft Visual Studio );
  • 单个 value_type _Complex 类型成员(封装对应的 C 语言复数类型)(例如 GNU libstdc++ );
  • 两个拥有相同访问权限的 value_type 类型成员,分别存有实部和虚部(例如 LLVM libc++ )。

实现不能添加会占用与实部和虚部冲突的存储的非静态数据成员,而且必须确保类模板特化不含任何填充。实现也必须确保对数组访问的优化问题,其中要考虑到指向 value_type 的指针可能为 std::complex 特化的别名,对应的数组亦然。

(C++11 起)

字面量

定义于内联命名空间 std::literals::complex_literals
表示纯虚数的 std::complex 字面量
(函数)

示例

#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';
 
    double PI = std::acos(-1);
    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)

参阅