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

C語言級數求和:計算 Σ(1/n!) 從 1 到 20,驗證 e-1 極限

     編輯:關於C語言

C語言級數求和:計算 Σ(1/n!) 從 1 到 20,驗證 e-1 極限

級數 Σ (1/n!) (n=1..∞) 收斂於 e - 1 ≈ 1.718281828...。本文實現高精度計算,分析原始碼的整數除法陷阱,提供雙精度與長雙精度驗證。

原始碼關鍵 Bug:整數除法

// 原始碼
double s=0, t=1;
for (n=1; n<=20; n++) {
    t = t * (1/n);  // 錯誤!1/n 為整數除法,n>1 時結果恆為 0
    s = s + t;
}
// 實際運算:t 首項 1*1=1,第二項 1*0=0,後續全 0,結果 s=1.0

修正:1.0 / n 或 1 / (double)n 強制浮點除法。

正確實現 (雙精度)

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

int main() {
    double sum = 0.0;
    double term = 1.0;  // 1/0! = 1,但題目從 1! 開始
    
    for (int n = 1; n <= 20; n++) {
        term /= n;       // 遞推:1/n! = (1/(n-1)!) / n
        sum += term;
    }
    
    printf("Σ(1/n!) n=1..20 = %.15f\n", sum);
    printf("e - 1          = %.15f\n", M_E - 1.0);
    printf("差值            = %.3e\n", fabs(sum - (M_E - 1.0)));
    
    return 0;
}

執行結果

Σ(1/n!) n=1..20 = 1.718281828459045
e - 1          = 1.718281828459045
差值            = 0.000e+00

遞推關係推導

term₁ = 1/1! = 1
term₂ = 1/2! = term₁ / 2
term₃ = 1/3! = term₂ / 3
...
termₙ = termₙ₋₁ / n

// 避免重複計算階乘,無溢出風險,數值穩定

長雙精度驗證 (更高精度)

int main() {
    long double sum = 0.0L;
    long double term = 1.0L;
    
    for (int n = 1; n <= 30; n++) {  // long double 可算更多項
        term /= n;
        sum += term;
    }
    
    printf("長雙精度 Σ(1/n!) n=1..30 = %.25Lf\n", sum);
    printf("e - 1 (長雙精度)         = %.25Lf\n", expl(1.0L) - 1.0L);
    return 0;
}

收斂速度分析

n項值 1/n!部分和與 e-1 差值
11.0000001.0000000.718282
20.5000001.5000000.218282
30.1666671.6666670.051615
40.0416671.7083330.009948
50.0083331.7166670.001615
60.0013891.7180560.000226
70.0001981.7182540.000028
80.0000251.7182790.000003
90.0000031.7182820.000000
102.8e-71.718282< 1e-15

**第 10 項已達雙精度極限**,20 項遠超需求。

數學背景:泰勒展開

eˣ = Σ xⁿ/n!  (n=0..∞)
e  = Σ 1/n!   (n=0..∞) = 1 + Σ 1/n! (n=1..∞)
∴ Σ 1/n! (n=1..∞) = e - 1

常見錯誤總結

錯誤後果修正
`t = t * (1/n)`整數除法,n>1 時項值歸零`t /= n` 或 `t *= 1.0/n`
重複計算階乘 `fact *= n`20! 溢出 64 位整數遞推除法 `term /= n`
用 float 累加7 位精度,尾項精度丟失用 double 或 long double

總結

級數 Σ(1/n!) 以極快速度收斂於 e-1。關鍵技巧:**遞推除法 `term /= n` 替代階乘計算**,避免溢出且數值穩定。雙精度下 10 項即達機器精度極限,20 項結果 **1.718281828459045** 與 e-1 完全一致。**切記:除法常數必須帶小數點**。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved