复数类型
复数类型是 C99 引入的数学类型,支持 _Complex 关键字和 <complex.h> 头文件。复数类型让科学计算、信号处理、电气工程等领域的代码更简洁、可读性更强。
基本用法
#include <complex.h>
double complex z = 1.0 + 2.0*I; /* I 是虚数单位 */
printf("Real: %f, Imag: %f\n", creal(z), cimag(z));
/* Real: 1.0, Imag: 2.0 */
printf("Magnitude: %f\n", cabs(z)); /* sqrt(1^2 + 2^2) = 2.236... */
printf("Phase: %f\n", carg(z)); /* atan2(2, 1) */
复数运算
#include <complex.h>
double complex a = 1.0 + 2.0*I;
double complex b = 3.0 - 1.0*I;
double complex sum = a + b; /* 4.0 + 1.0*I */
double complex diff = a - b; /* -2.0 + 3.0*I */
double complex prod = a * b; /* (1*3 - 2*(-1)) + (1*(-1) + 2*3)*I = 5.0 + 5.0*I */
double complex quot = a / b; /* 复数除法 */
复数函数
#include <complex.h>
double complex z = 1.0 + 1.0*I;
/* 幂和对数 */
double complex z2 = cpow(z, 2); /* z^2 */
double complex lz = clog(z); /* ln(z) */
double complex ez = cexp(z); /* e^z */
/* 三角函数 */
double complex sz = csin(z);
double complex cz = ccos(z);
/* 平方根 */
double complex rz = csqrt(z);
类型
float complex fc; /* 单精度复数 */
double complex dc; /* 双精度复数 */
long double complex ldc; /* 扩展精度复数 */
常见错误
忘记包含 complex.h:
/* 错误:I 未定义 */
double complex z = 1.0 + 2.0*I;
/* 正确 */
#include <complex.h>
用实数函数处理复数:
double complex z = 1.0 + 2.0*I;
double m = abs(z); /* 错误:abs 是整数绝对值 */
/* 正确 */
double m = cabs(z); /* 复数绝对值 */
最佳实践
- 科学计算用复数类型替代手动实部虚部分开
- 包含
<complex.h>获取I和函数 - 用
creal、cimag提取分量 - 复数运算性能可能低于手动实现,关键路径测试
- 注意 C11 起复数是可选特性