复数算术
若实现定义了宏常量 |
(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 使用。
标准算术运算符 +, -, *, / 可用于实数、复数及虚数类型的任意混合。
推荐编译器定义 |
(C99 起) (C11 前) |
若定义 |
(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>
的未来扩充而潜在 (C23 起)保留,并且在包含该头文件的程序中不可使用: 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 标准以“复弧双曲正弦( complex arc hyperbolic sine )”等名称指名反双曲函数,双曲函数的反函数却是面积函数。它们的参数是双曲扇形的面积,而非弧长。正确名称是“复反双曲正弦”等等。一些作者会使用“复面积双曲正弦( complex area hyperbolic sine )”等名称。
若组分的一部分是无穷大,则复数或虚数为无穷大,即使另一组分是 NaN 。
若双组分都不是无穷大或 NaN ,则复数或虚数是有限的。
若双组分皆为正零或负零,则复数或虚数为零。
示例
#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
引用
- C17 标准(ISO/IEC 9899:2018):
- 6.10.8.3/1/2
__STDC_NO_COMPLEX__
(p: 128)
- 6.10.8.3/1/2
- 6.10.8.3/1/2
__STDC_IEC_559_COMPLEX__
(p: 128)
- 6.10.8.3/1/2
- 7.3 Complex arithmetic
<complex.h>
(p: 136-144)
- 7.3 Complex arithmetic
- 7.25 Type-generic math
<tgmath.h>
(p: 272-273)
- 7.25 Type-generic math
- 7.31.1 Complex arithmetic
<complex.h>
(p: 391)
- 7.31.1 Complex arithmetic
- Annex G (normative) IEC 60559-compatible complex arithmetic (p: 469-479)
- C11 标准(ISO/IEC 9899:2011):
- 6.10.8.3/1/2
__STDC_NO_COMPLEX__
(p: 177)
- 6.10.8.3/1/2
- 6.10.8.3/1/2
__STDC_IEC_559_COMPLEX__
(p: 177)
- 6.10.8.3/1/2
- 7.3 Complex arithmetic
<complex.h>
(p: 188-199)
- 7.3 Complex arithmetic
- 7.25 Type-generic math
<tgmath.h>
(p: 373-375)
- 7.25 Type-generic math
- 7.31.1 Complex arithmetic
<complex.h>
(p: 455)
- 7.31.1 Complex arithmetic
- Annex G (normative) IEC 60559-compatible complex arithmetic (p: 532-545)
- C99 标准(ISO/IEC 9899:1999):
- 6.10.8/2
__STDC_IEC_559_COMPLEX__
(p: 161)
- 6.10.8/2
- 7.3 Complex arithmetic
<complex.h>
(p: 170-180)
- 7.3 Complex arithmetic
- 7.22 Type-generic math
<tgmath.h>
(p: 335-337)
- 7.22 Type-generic math
- 7.26.1 Complex arithmetic
<complex.h>
(p: 401)
- 7.26.1 Complex arithmetic
- Annex G (informative) IEC 60559-compatible complex arithmetic (p: 467-480)