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

C語言計算交替級數:1/1 - 1/2 + 1/3 - 1/4 + ... + 1/99 - 1/100

     編輯:關於C

兩種演算法實作與效能比較

計算前 100 項交替調和級數部分和,展示數學庫函數法與旗標變數法的差異,並分析浮點數精度特性。

方法一:使用 pow() 計算正負號

#include <stdio.h>
#include <math.h>

int main() {
    double sum = 0.0;
    
    for (int n = 1; n <= 100; n++) {
        // (-1)^(n+1):n=1 為 +1, n=2 為 -1, n=3 為 +1...
        double sign = pow(-1.0, n + 1);
        sum += sign / n;
    }
    
    printf("方法一結果:%.12f\n", sum);
    printf("ln(2) 參考值:%.12f\n", log(2.0));
    printf("絕對誤差:%.2e\n", fabs(sum - log(2.0)));
    
    return 0;
}

方法二:旗標變數翻轉(推薦)

#include <stdio.h>

int main() {
    double sum = 0.0;
    int sign = 1; // 從正號開始
    
    for (int n = 1; n <= 100; n++) {
        sum += sign * (1.0 / n);
        sign = -sign; // 每次翻轉
    }
    
    printf("方法二結果:%.12f\n", sum);
    printf("ln(2) 參考值:%.12f\n", 0.693147180560);
    
    return 0;
}

效能與精度分析

維度pow() 法旗標法
CPU 週期~100-200 cycles/次~3-5 cycles/次
函數呼叫需連結 math library (-lm)純整數/浮點運算
數值穩定性良好良好
程式碼可讀性數學定義直觀演算法邏輯直觀

關鍵技術細節

  1. 1.0/n 強制浮點除法:寫成 1/n 會整數除法截斷為 0
  2. double vs float:雙精度誤差 ~1e-15,單精度 ~1e-7,建議用 double
  3. 編譯優化:-O2 下旗標法會被優化為無分支碼

數學背景延伸

  • 級數定義:Σ_{n=1}^{∞} (-1)^{n+1}/n = ln(2)
  • 收斂性質:條件收斂(絕對值級數發散),重新排列項次可改變和
  • 加速收斂:兩兩分組 Σ 1/(2k(2k-1)) 收斂快一倍

加速版本程式碼

// 僅需 50 次迴圈達到相同精度
double sum = 0.0;
for (int k = 1; k <= 50; k++) {
    sum += 1.0 / (2 * k * (2 * k - 1));
}
printf("加速版 (50項):%.12f\n", sum);

常見錯誤避坑

  • 忘記 -lm 連結數學庫(pow 版本)
  • 整數除法 1/n 導致結果為 0
  • 迴圈邊界錯誤(<=100 vs <100)
  • 使用 float 導致精度不足
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved