#complex.h
这个头文件提供 复数运算 的相关功能,提供了一系列处理复数的类型定义、宏和函数。
复数在数字信号处理、系统控制理论、电路分析、量子力学等数学和工程领域有着广泛的应用。
在 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() {
// ========== 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 的双曲反正切 |