复数算术
| 
 若实现定义了宏常量   | 
(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__ ,则支持虚数。  | 
(C11 起) | 
|   定义于头文件  
<complex.h>  | |
 类型 | |
|    (C99)  | 
  虚数类型宏  (关键词宏)  | 
|    (C99)  | 
  复数类型宏  (关键词宏)  | 
 虚数常量 | |
|    (C99)  | 
  虚数单位常量 i  (宏常量)  | 
|    (C99)  | 
   复数单位常量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)(C99)  | 
  计算复数的自然对数  (函数)  | 
 幂函数 | |
|    (C99)(C99)(C99)  | 
  计算复数幂函数  (函数)  | 
|    (C99)(C99)(C99)  | 
  计算复数平方根  (函数)  | 
 三角函数 | |
|    (C99)(C99)(C99)  | 
  计算复数正弦  (函数)  | 
|    (C99)(C99)(C99)  | 
  计算复数余弦  (函数)  | 
|    (C99)(C99)(C99)  | 
  计算复数正切  (函数)  | 
|    (C99)(C99)(C99)  | 
  计算复数反正弦  (函数)  | 
|    (C99)(C99)(C99)  | 
  计算复数反余弦  (函数)  | 
|    (C99)(C99)(C99)  | 
  计算复数反正切  (函数)  | 
 双曲函数 | |
|    (C99)(C99)(C99)  | 
  计算复数双曲正弦  (函数)  | 
|    (C99)(C99)(C99)  | 
  计算复双曲余弦  (函数)  | 
|    (C99)(C99)(C99)  | 
  计算复数双曲正切  (函数)  | 
|    (C99)(C99)(C99)  | 
  计算复数反双曲正弦  (函数)  | 
|    (C99)(C99)(C99)  | 
  计算复数反双曲余弦  (函数)  | 
|    (C99)(C99)(C99)  | 
  计算复数反双曲正切  (函数)  | 
注意
下列函数名为 <complex.h> 的未来扩充而保留,并且在包含该头文件的程序中不可使用: cerf 、 cerfc 、 cexp2 、 cexpm1、 clog10 、 clog1p 、 clog2 、 clgamma 及 ctgamma ,还有它们带 -f 及 -l 后缀的变体。
尽管 C 标准以“复弧双曲正弦( complex arc hyperbolic sine )”等名称指名反双曲函数,双曲函数的反函数却是面积函数。它们的参数是双曲扇形的面积,而非弧长。正确名称是“复反双曲正弦”等等。一些作者会使用“复面积双曲正弦( complex area hyperbolic sine )”等名称。
若组分的一部分是无穷大,则复数或虚数为无穷大,即使另一组分是 NaN 。
若双组分都不是无穷大或 NaN ,则复数或虚数是有限的。
若双组分皆为正零或负零,则复数或虚数为零。
某些平台不支持虚数类型,变通方式是使用复数和其实浮点转换类型进行运算。且以下使用的函数如果是 <tgmath.h> 的,会与 <math.h> 产生命名冲突,导致操作系统出现资源占满的死循环现象,建议直接使用来自 <complex.h> 的函数。
示例
#include <stdio.h> #include <complex.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
引用
- C11 standard (ISO/IEC 9899:2011):
 
- 6.10.8.3/1/2 __STDC_NO_COMPLEX__ (p: 177)
 
- 6.10.8.3/1/2 __STDC_IEC_559_COMPLEX__ (p: 177)
 
- 7.3 Complex arithmetic <complex.h> (p: 188-199)
 
- 7.3.1/2 __STDC_NO_COMPLEX__ (p: 188)
 
- 7.25 Type-generic math <tgmath.h> (p: 373-375)
 
- 7.31.1 Complex arithmetic <complex.h> (p: 455)
 
- B.2 Complex <complex.h> (p: 475-477)
 
- Annex G (normative) IEC 60559-compatible complex arithmetic (p: 532-545)
 
- G.1/1 __STDC_IEC_559_COMPLEX__ (p: 532)
 
- C99 standard (ISO/IEC 9899:1999):
 
- 6.10.8/2 __STDC_IEC_559_COMPLEX__ (p: 161)
 
- 7.3 Complex arithmetic <complex.h> (p: 170-180)
 
- 7.22 Type-generic math <tgmath.h> (p: 335-337)
 
- 7.26.1 Complex arithmetic <complex.h> (p: 401)
 
- B.2 Complex <complex.h> (p: 419-420)
 
- Annex G (informative) IEC 60559-compatible complex arithmetic (p: 467-480)
 
- G.1/1 __STDC_IEC_559_COMPLEX__ (p: 467)