Namespaces
Variants

Complex number arithmetic

From cppreference.net

若实现定义了宏常量 __STDC_NO_COMPLEX__ ,则不会提供复数类型、头文件 <complex.h> 以及此处列出的所有名称。

(C11 起)

C语言从C99标准开始,通过三种内置类型 double _Complex float _Complex long double _Complex (参见 _Complex )支持复数运算。当包含头文件 <complex.h> 后,这三种复数类型也可表示为 double complex float complex long double complex

除了复数类型外,还可能支持三种虚数类型: double _Imaginary float _Imaginary long double _Imaginary (参见 _Imaginary )。当包含头文件 <complex.h> 时,这三种虚数类型也可通过 double imaginary float imaginary long double imaginary 进行访问。

标准算术运算符 + , - , * , / 可用于实数、复数和虚数类型的任意组合。

建议(但非强制要求)定义 __STDC_IEC_559_COMPLEX__ 的编译器支持虚数。POSIX 建议通过检查宏 _Imaginary_I 是否被定义来识别虚数支持。

(C99 起)
(C11 前)

若定义了 __STDC_IEC_559_COMPLEX__ __STDC_IEC_60559_COMPLEX__ (C23 起) 则支持虚数。

(C11 起)
定义于头文件 <complex.h>

目录

类型
虚数类型宏
(关键字宏)
(C99)
复数类型宏
(关键字宏)
虚数常量
虚数单位常量 i
(宏常量)
复数单位常量 i
(宏常量)
(C99)
复数或虚数单位常量 i
(宏常量)
操作函数
(C11) (C11) (C11)
从实部和虚部构造复数
(函数宏)
(C99) (C99) (C99)
计算复数的实部
(函数)
(C99) (C99) (C99)
计算复数的虚部
(函数)
(C99) (C99) (C99)
计算复数的模
(函数)
(C99) (C99) (C99)
计算复数的辐角
(函数)
(C99) (C99) (C99)
计算复共轭
(函数)
(C99) (C99) (C99)
计算黎曼球面上的投影
(函数)
指数函数
(C99) (C99) (C99)
计算复数的以 e 为底的指数
(函数)
(C99) (C99) (

注释

以下函数名称 可能 (自 C23 起) 为将来添加到 <complex.h> 而保留,在包含该头文件的程序中不可使用: cerf cerfc cexp2 cexpm1 clog10 clog1p clog2 clgamma ctgamma csinpi ccospi ctanpi casinpi cacospi catanpi ccompoundn cpown cpowr crootn crsqrt cexp10m1 cexp10 cexp2m1 clog10p1 clog2p1 clogp1 (自 C23 起) ,以及它们的 -f -l 后缀变体。

尽管C标准将反双曲函数命名为"复反双曲正弦"等,但双曲函数的反函数实际上是面积函数。它们的参数是双曲扇形的面积,而非弧长。正确的名称应为"复反双曲正弦"等。部分作者使用"复面积双曲正弦"等称谓。

若复数或虚数的任一部分为无穷大,即使另一部分为 NaN,该数即为无穷大。

当实部和虚部均非无穷大亦非非数字时,复数或虚数即为有限值。

复数或虚数当其实部和虚部均为正零或负零时被视为零值。

虽然MSVC确实提供了 <complex.h> 头文件,但其并未将复数实现为原生类型,而是采用 struct 结构体实现。这些结构体与标准C复数类型不兼容,且不支持 + - * / 运算符。

示例

#include <complex.h>
#include <stdio.h>
#include <tgmath.h>
int main(void)
{
    double complex z1 = I * I;     // 虚数单位平方
    printf("I * I = %.1f%+.1fi\n", creal(z1), cimag(z1));
    double complex z2 = pow(I, 2); // 虚数单位平方
    printf("pow(I, 2) = %.1f%+.1fi\n", creal(z2), cimag(z2));
    double PI = acos(-1);
    double complex z3 = exp(I * PI); // 欧拉公式
    printf("exp(I*PI) = %.1f%+.1fi\n", creal(z3), cimag(z3));
    double complex z4 = 1 + 2 * I, z5 = 1 - 2 * I; // 共轭复数
    printf("(1+2i)*(1-2i) = %.1f%+.1fi\n", creal(z4 * z5), cimag(z4 * z5));
}

输出:

I * I = -1.0+0.0i
pow(I, 2) = -1.0+0.0i
exp(I*PI) = -1.0+0.0i
(1+2i)*(1-2i) = 5.0+0.0i

参考文献

扩展内容
  • C23 标准 (ISO/IEC 9899:2024):
  • 6.10.8.3/1/2 __STDC_NO_COMPLEX__ (页: TBD)
  • 6.10.8.3/1/2 __STDC_IEC_559_COMPLEX__ (页: TBD)
  • 7.3 复数运算 <complex.h> (页: TBD)
  • 7.25 泛型数学 <tgmath.h> (页: TBD)
  • 7.31.1 复数运算 <complex.h> (页: TBD)
  • 附录 G (规范性) IEC 60559 兼容复数运算 (页: TBD)
  • C17 标准 (ISO/IEC 9899:2018):
  • 6.10.8.3/1/2 __STDC_NO_COMPLEX__ (页: 128)
  • 6.10.8.3/1/2 __STDC_IEC_559_COMPLEX__ (页: 128)
  • 7.3 复数运算 <complex.h> (页: 136-144)
  • 7.25 泛型数学 <tgmath.h> (页: 272-273)
  • 7.31.1 复数运算 <complex.h> (页: 391)
  • 附录 G (规范性) IEC 60559 兼容复数运算 (页: 469-479)
  • C11 标准 (ISO/IEC 9899:2011):
  • 6.10.8.3/1/2 __STDC_NO_COMPLEX__ (页: 177)
  • 6.10.8.3/1/2 __STDC_IEC_559_COMPLEX__ (页: 177)
  • 7.3 复数运算 <complex.h> (页: 188-199)
  • 7.25 泛型数学 <tgmath.h> (页: 373-375)
  • 7.31.1 复数运算 <complex.h> (页: 455)
  • 附录 G (规范性) IEC 60559 兼容复数运算 (页: 532-545)
  • C99 标准 (ISO/IEC 9899:1999):
  • 6.10.8/2 __STDC_IEC_559_COMPLEX__ (页: 161)
  • 7.3 复数运算 <complex.h> (页: 170-180)
  • 7.22 泛型数学 <tgmath.h> (页: 335-337)
  • 7.26.1 复数运算 <complex.h> (页: 401)
  • 附录 G (资料性) IEC 60559 兼容复数运算 (页: 467-480)

参见

C++ 文档 关于 复数运算