| 類型 | 實部/虛部 | 字面量後綴 | 打印格式 |
float _Complex | float | 1.0f + 2.0f*i | %f+%fi (需拆分) |
double _Complex | double | 1.0 + 2.0*i | %f+%fi |
long double _Complex | long double | 1.0L + 2.0L*i | %Lf+%Lfi |
便利宏:包含 complex.h 後,complex 等價於 _Complex,I 定義為虛部單位 (_Complex_I)。
二、構建與基本運算
#include <stdio.h>
#include <complex.h>
int main() {
double complex z1 = 3.0 + 4.0*I; // 3+4i
double complex z2 = 1.0 - 2.0*I; // 1-2i
// 四則運算:直接用 + - * /
printf("加: %.2f%+.2fi\n", creal(z1+z2), cimag(z1+z2)); // 4.00+2.00i
printf("減: %.2f%+.2fi\n", creal(z1-z2), cimag(z1-z2)); // 2.00+6.00i
printf("乘: %.2f%+.2fi\n", creal(z1*z2), cimag(z1*z2)); // 11.00-2.00i
printf("除: %.2f%+.2fi\n", creal(z1/z2), cimag(z1/z2)); // -1.00+2.00i
// 共軛、模、辐角
printf("共軛: %.2f%+.2fi\n", creal(conj(z1)), cimag(conj(z1))); // 3.00-4.00i
printf("模: %.2f\n", cabs(z1)); // 5.00
printf("辐角: %.2f rad\n", carg(z1)); // 0.93 rad (~53°)
return 0;
}
三、實部/虛部提取函數族
| 類型 | 實部 | 虛部 |
| float _Complex | crealf(z) | cimagf(z) |
| double _Complex | creal(z) | cimag(z) |
| long double _Complex | creall(z) | cimagl(z) |
注意:無 creal(z) 通用宏,必須按類型選擇正確後綴函數。
四、超越數學函數 (複數版)
// 指數、對數、冪、三角、雙曲
cexp(z) // e^z
clog(z) // 主值對數
cpow(z, w) // z^w
csin(z), ccos(z), ctan(z)
casin(z), cacos(z), catan(z)
csinh(z), ccosh(z), ctanh(z)
csqrt(z) // 主值平方根
cproj(z) // Riemann 球面投影
五、完整示例:交流電路阻抗計算
// 串聯 RLC 電路:Z = R + j(ωL - 1/ωC)
#include <stdio.h>
#include <complex.h>
#include <math.h>
double complex impedance(double R, double L, double C, double freq) {
double omega = 2 * M_PI * freq;
double complex Z = R + I * (omega * L - 1.0/(omega * C));
return Z;
}
int main() {
double R = 100.0, L = 10e-3, C = 100e-9;
for (double f = 100; f <= 10000; f *= 10) {
double complex Z = impedance(R, L, C, f);
double mag = cabs(Z);
double phase = carg(Z) * 180 / M_PI;
printf("f=%.0f Hz: |Z|=%.2f Ω, φ=%.1f°\n", f, mag, phase);
}
return 0;
}
六、輸出格式化最佳實踐
void print_complex(const char *label, double complex z) {
double re = creal(z), im = cimag(z);
if (im >= 0)
printf("%s: %.4f + %.4fi\n", label, re, im);
else
printf("%s: %.4f - %.4fi\n", label, re, -im);
}
// C23 將引入專用格式符,目前需手動拆分
七、編譯與鏈接注意事項
- GCC/Clang:
-std=c99 -lm (數學庫需顯式鏈接)。
- MSVC:VS 2013+ 支持 C99 複數,需
/std:c11 或更高。
- 嵌入式:newlib/nano 支持完整;極小型 MCU 可能需裁剪或軟件模擬。
八、避坑指南
- 不要用
i 做循環變量:與宏 I 衝突,改用 idx/k。
- 浮點字面量加後綴:
1.0*I 是 double,1.0f*I 是 float,避免隱式轉換警告。
- 比較用
cabs(z1-z2) < eps:勿直接 ==。
sqrt(-1) 是域錯誤,必須用 csqrt(-1+0*I) 或 I。
C99 複數支持讓科學計算代碼從「手寫結構體+函數指針」進化為「原生類型+運算符重載風格」。善用 complex.h,能讓 DSP、控制理論、電磁場仿真等領域的 C 代碼既高效又可讀。
- 上一篇文章: C語言快速排序算法深度剖析:單樞軸分區、遞歸邏輯與優化變體
- 下一篇文章: C語言計算文件 SHA-1 哈希值:標準實現、流式處理與工程封裝
Copyright ©
程式碼之家 All Rights Reserved