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

C語言數學計算:交替調和級數求和

     編輯:關於C

計算 1 - 1/2 + 1/3 - 1/4 + ... + 1/99 - 1/100

這是萊布尼茲級數的部分和,收斂於 ln(2) ≈ 0.693147。本文展示兩種實作方式並分析精度差異。

方法一: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
        double sign = pow(-1, n + 1);
        sum += sign / n;
    }
    
    printf("方法一結果:%.10f\n", sum);
    printf("ln(2) 真值:%.10f\n", log(2.0));
    printf("誤差:%.10f\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("方法二結果:%.10f\n", sum);
    printf("ln(2) 真值:%.10f\n", 0.6931471805599453);
    
    return 0;
}

精度與效能分析

指標pow() 法旗標法
執行速度較慢(函數呼叫開銷)極快(簡單乘法)
數值精度良好良好
程式碼清晰度數學意圖明確演算法意圖明確

關鍵細節:1.0/n 的必要性

1/n 整數除法會截斷為 0(n>1 時)。必須寫成 1.0/n 或 (double)1/n 強制浮點數除法。

數學延伸

  • 無限級數:Σ (-1)^(n+1)/n = ln(2)
  • 收斂速度:線性收斂,要達到 10^-6 精度需約 1,000,000 項
  • 加速收斂:可使用歐拉變換或將項兩兩分組:(1-1/2)+(1/3-1/4)+... = Σ 1/(2n(2n-1))

加速版本

// 兩兩分組版:收斂快一倍
double sum = 0.0;
for (int n = 1; n <= 50; n++) {
    sum += 1.0 / (2 * n * (2 * n - 1));
}
printf("加速版結果:%.10f\n", sum);
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved