这个头文件提供 复数运算 的相关功能,提供了一系列处理复数的类型定义、宏和函数。
复数在数字信号处理、系统控制理论、电路分析、量子力学等数学和工程领域有着广泛的应用。
在 complex.h 中定义了以下复数类型:
float complex - 单精度复数,即实部和虚部是 float 类型
double complex - 双精度复数,即实部和虚部是 double 类型
long double complex - 长双精度复数,即实部和虚部是 long double 类型
其中虚数单位通过常量 I(大写字母 I)表示。
需要链接数学库,例如在 gcc 中需要添加
-lm链接选项。
#include <stdio.h>
#include <complex.h> // 复数支持
#include <math.h> // 数学函数
int main(void) {
// ========== 1. 复数基础操作 ==========
double complex z1 = 3.0 + 4.0 * I; // 3 + 4i
double complex z2 = 1.0 - 2.0 * I; // 1 - 2i
// 算术运算
double complex sum = z1 + z2;
double complex product = z1 * z2;
double complex conjugate = conj(z1);
printf("基础运算:\n");
printf("z1 + z2 = %.2f %+.2fi\n", creal(sum), cimag(sum));
printf("z1 * z2 = %.2f %+.2fi\n", creal(product), cimag(product));
printf("z1的共轭复数 = %.2f %+.2fi\n\n", creal(conjugate), cimag(conjugate));
// ========== 2. 工程应用:阻抗计算 ==========
double R = 5.0; // 电阻 (Ω)
double L = 0.1; // 电感 (H)
double omega = 50; // 角频率 (rad/s)
double complex Z = R + omega * L * I; // 阻抗 Z = R + jωL
printf("阻抗计算 (RLC电路):\n");
printf("Z = %.2f + j%.2f Ω\n", creal(Z), cimag(Z));
printf("|Z| = %.2f Ω\n", cabs(Z));
printf("Z 的相位角 = %.2f 度\n\n", carg(Z) * 180 / M_PI);
// ========== 3. 信号处理:DFT计算 ==========
double complex signal[] = {1 + 0*I, 0 + 1*I, -1 + 0*I, 0 - 1*I}; // 示例信号
int N = sizeof(signal) / sizeof(signal[0]);
double complex freq_component = 0;
for (int k = 0; k < N; k++) {
freq_component += signal[k] * cexp(-I * 2 * M_PI * k / N); // DFT公式
}
printf("信号分析 (DFT):\n");
printf("基频分量 = %.2f %+.2fi\n", creal(freq_component), cimag(freq_component));
printf("幅值主值 = %.2f, 相位 = %.2f°\n\n",
cabs(freq_component), carg(freq_component) * 180 / M_PI);
// ========== 4. 复数函数应用 ==========
double complex z = 1.0 + 1.0 * I;
printf("复数函数:\n");
printf("e^(1+i) = %.2f %+.2fi\n", creal(cexp(z)), cimag(cexp(z)));
printf("sqrt(i) = %.2f %+.2fi\n", creal(csqrt(I)), cimag(csqrt(I)));
printf("sin(iπ/2) = %.2fi\n", cimag(csin(I * M_PI_2)));
return 0;
}
运行结果:
user@host:~ $ gcc main.c -lm
user@host:~ $ ./a.out
基础运算:
z1 + z2 = 4.00 +2.00i
z1 * z2 = 11.00 -2.00i
z1的共轭复数 = 3.00 -4.00i
阻抗计算 (RLC电路):
Z = 5.00 + j5.00 Ω
|Z| = 7.07 Ω
Z 的相位角 = 45.00 度
信号分析 (DFT):
基频分量 = 4.00 +0.00i
幅值主值 = 4.00, 相位 = 0.00°
复数函数:
e^(1+i) = 1.47 +2.29i
sqrt(i) = 0.71 +0.71i
sin(iπ/2) = 2.30i
| 类型 | 标准 | 说明 |
| :- | :- | :-
| imaginary | C99 | 虚数类型
| complex | C99 | 复数类型
| 常量 | 标准 | 说明 |
| :- | :- | :-
| I | C99 | 虚数单位
| 函数 | 标准 | 说明 |
|---|---|---|
CMPLX |
C11 | 创建 double complex 类型的复数 |
CMPLXF |
C11 | 创建 float complex 类型的复数 |
CMPLXL |
C11 | 创建 long double complex 类型的复数 |
creal |
C99 | 获取 double complex 的实部 |
crealf |
C99 | 获取 float complex 的实部 |
creall |
C99 | 获取 long double complex 的实部 |
cimag |
C99 | 获取 double complex 的虚部 |
cimagf |
C99 | 获取 float complex 的虚部 |
cimagl |
C99 | 获取 long double complex 的虚部 |
cabs |
C99 | 计算 double complex 的绝对值 |
cabsf |
C99 | 计算 float complex 的绝对值 |
cabsl |
C99 | 计算 long double complex 的绝对值 |
carg |
C99 | 计算 double complex 的辐角主值(−π 到 π) |
cargf |
C99 | 计算 float complex 的辐角主值(−π 到 π) |
cargl |
C99 | 计算 long double complex 的辐角主值(−π 到 π) |
conj |
C99 | 计算 double complex 的共轭复数 |
conjf |
C99 | 计算 float complex 的共轭复数 |
conjl |
C99 | 计算 long double complex 的共轭复数 |
cproj |
C99 | 计算 double complex 在黎曼球上的投影 |
cprojf |
C99 | 计算 float complex 在黎曼球上的投影 |
cprojl |
C99 | 计算 long double complex 在黎曼球上的投影 |
cexp |
C99 | 计算 double complex 以自然常数 e 为底的复指数 |
cexpf |
C99 | 计算 float complex 以自然常数 e 为底的复指数 |
cexpl |
C99 | 计算 long double complex 以自然常数 e 为底的复指数 |
clog |
C99 | 计算 double complex 以自然常数 e 为底的对数 |
clogf |
C99 | 计算 float complex 以自然常数 e 为底的对数 |
clogl |
C99 | 计算 long double complex 以自然常数 e 为底的对数 |
cpow |
C99 | 计算 double complex 的幂 |
cpowf |
C99 | 计算 float complex 的幂 |
cpowl |
C99 | 计算 long double complex 的幂 |
csqrt |
C99 | 计算 double complex 的平方根 |
csqrtf |
C99 | 计算 float complex 的平方根 |
csqrtl |
C99 | 计算 long double complex 的平方根 |
csin |
C99 | 计算 double complex 的正弦 |
csinf |
C99 | 计算 float complex 的正弦 |
csinl |
C99 | 计算 long double complex 的正弦 |
ccos |
C99 | 计算 double complex 的余弦 |
ccosf |
C99 | 计算 float complex 的余弦 |
ccosl |
C99 | 计算 long double complex 的余弦 |
ctan |
C99 | 计算 double complex 的正切 |
ctanf |
C99 | 计算 float complex 的正切 |
ctanl |
C99 | 计算 long double complex 的正切 |
casin |
C99 | 计算 double complex 的反正弦 |
casinf |
C99 | 计算 float complex 的反正弦 |
casinl |
C99 | 计算 long double complex 的反正弦 |
cacos |
C99 | 计算 double complex 的反余弦 |
cacosf |
C99 | 计算 float complex 的反余弦 |
cacosl |
C99 | 计算 long double complex 的反余弦 |
catan |
C99 | 计算 double complex 的反正切 |
catanf |
C99 | 计算 float complex 的反正切 |
catanl |
C99 | 计算 long double complex 的反正切 |
csinh |
C99 | 计算 double complex 的双曲正弦 |
csinhf |
C99 | 计算 float complex 的双曲正弦 |
csinhl |
C99 | 计算 long double complex 的双曲正弦 |
ccosh |
C99 | 计算 double complex 的双曲余弦 |
ccoshf |
C99 | 计算 float complex 的双曲余弦 |
ccoshl |
C99 | 计算 long double complex 的双曲余弦 |
ctanh |
C99 | 计算 double complex 的双曲正切 |
ctanhf |
C99 | 计算 float complex 的双曲正切 |
ctanhl |
C99 | 计算 long double complex 的双曲正切 |
casinh |
C99 | 计算 double complex 的双曲反正弦 |
casinhf |
C99 | 计算 float complex 的双曲反正弦 |
casinhl |
C99 | 计算 long double complex 的双曲反正弦 |
cacosh |
C99 | 计算 double complex 的双曲反余弦 |
cacoshf |
C99 | 计算 float complex 的双曲反余弦 |
cacoshl |
C99 | 计算 long double complex 的双曲反余弦 |
catanh |
C99 | 计算 double complex 的双曲反正切 |
catanhf |
C99 | 计算 float complex 的双曲反正切 |
catanhl |
C99 | 计算 long double complex 的双曲反正切 |