复数算术
若实现定义了宏常量 |
(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__
(第 128 页)
- 6.10.8.3/1/2
- 6.10.8.3/1/2
__STDC_IEC_559_COMPLEX__
(第 128 页)
- 6.10.8.3/1/2
- 7.3 Complex arithmetic
<complex.h>
(第 136-144 页)
- 7.3 Complex arithmetic
- 7.25 Type-generic math
<tgmath.h>
(第 272-273 页)
- 7.25 Type-generic math
- 7.31.1 Complex arithmetic
<complex.h>
(第 391 页)
- 7.31.1 Complex arithmetic
- Annex G (normative) IEC 60559-compatible complex arithmetic (第 469-479 页)
- C11 标准(ISO/IEC 9899:2011):
- 6.10.8.3/1/2
__STDC_NO_COMPLEX__
(第 177 页)
- 6.10.8.3/1/2
- 6.10.8.3/1/2
__STDC_IEC_559_COMPLEX__
(第 177 页)
- 6.10.8.3/1/2
- 7.3 Complex arithmetic
<complex.h>
(第 188-199 页)
- 7.3 Complex arithmetic
- 7.25 Type-generic math
<tgmath.h>
(第 373-375 页)
- 7.25 Type-generic math
- 7.31.1 Complex arithmetic
<complex.h>
(第 455 页)
- 7.31.1 Complex arithmetic
- Annex G (normative) IEC 60559-compatible complex arithmetic (第 532-545 页)
- C99 标准(ISO/IEC 9899:1999):
- 6.10.8/2
__STDC_IEC_559_COMPLEX__
(第 161 页)
- 6.10.8/2
- 7.3 Complex arithmetic
<complex.h>
(第 170-180 页)
- 7.3 Complex arithmetic
- 7.22 Type-generic math
<tgmath.h>
(第 335-337 页)
- 7.22 Type-generic math
- 7.26.1 Complex arithmetic
<complex.h>
(第 401 页)
- 7.26.1 Complex arithmetic
- Annex G (informative) IEC 60559-compatible complex arithmetic (第 467-480 页)