Complex number arithmetic
|
若实现定义了宏常量
|
(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)
(
|
||
注释
以下函数名称
可能
(自 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
参考文献
| 扩展内容 |
|---|
|
参见
|
C++ 文档
关于
复数运算
|