复数算术
若实现定义了宏常量 |
(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)