首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C語言複數運算完全指南:C99 complex.h、數學函數與工程應用

     編輯:關於C語言

C99 引入 <complex.h> 原生支持複數類型與運算,消除了手工實現結構體的繁瑣。本文系統講解類型定義、字面量構建、基本運算、數學函數、輸出格式化與工程級應用模式。

一、三種複數類型

便利宏:包含 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 _Complexfloat1.0f + 2.0f*i%f+%fi (需拆分)
double _Complexdouble1.0 + 2.0*i%f+%fi
long double _Complexlong double1.0L + 2.0L*i%Lf+%Lfi

注意:無 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 可能需裁剪或軟件模擬。

八、避坑指南

  1. 不要用 i 做循環變量:與宏 I 衝突,改用 idx/k。
  2. 浮點字面量加後綴:1.0*I 是 double,1.0f*I 是 float,避免隱式轉換警告。
  3. 比較用 cabs(z1-z2) < eps:勿直接 ==。
  4. sqrt(-1) 是域錯誤,必須用 csqrt(-1+0*I) 或 I。

C99 複數支持讓科學計算代碼從「手寫結構體+函數指針」進化為「原生類型+運算符重載風格」。善用 complex.h,能讓 DSP、控制理論、電磁場仿真等領域的 C 代碼既高效又可讀。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
類型實部虛部
float _Complexcrealf(z)cimagf(z)
double _Complexcreal(z)cimag(z)
long double _Complexcreall(z)cimagl(z)