首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C 語言計算 e^x 級數展開:迴圈終止條件誤差分析與修正版代碼

     編輯:程式設計綜合問答

題目:計算 e^x = 1 + x + x²/2! + x³/3! + ...,直到最後一項 < 0.001 為止。原代碼終止條件 `m-0.001 >= 1e-10` 邏輯錯誤導致精度不足。提供修正版與誤差分析。

原代碼問題


for(i=1; m-0.001 >= 1e-10; i++)  // ❌ 錯誤:m 是當前項值,非誤差
    s += (m = pow(x,i)/f(i));
  • `m` 為當前項值,而非累積誤差。
  • 條件 `m - 0.001 >= 1e-10` 等價於 `m >= 0.0010000001`,**當項值大於 0.001 時繼續**,但題目要求「最後一項 < 0.001 為止」,即 **項值 < 0.001 時停止**。
  • 浮點比較直接用 `< 0.001` 即可,無需 `1e-10` 容差。

修正版代碼


#include 
#include 

double fact(double m) {
    if (m > 1) return m * fact(m - 1);
    return 1;
}

int main() {
    double x, s = 1, term = 1;
    scanf("%lf", &x);
    for (int i = 1; ; i++) {
        term = pow(x, i) / fact(i);
        if (term < 0.001) break;  // ✅ 正確終止條件
        s += term;
    }
    printf("%.5f\n", s);
    return 0;
}

測試驗證

輸入 x輸出標準值 e^x誤差
01.000001.000000
12.718062.718282.2e-4
0.51.648441.648722.8e-4

誤差來源:截斷誤差 (忽略 <0.001 後續項) + 遞迴階乘疊加誤差。滿足題目精度要求。

優化建議

  1. 遞推計算項值:term *= x / i; 避免 `pow`、`fact` 重複運算,效能提升 10 倍+。
  2. 階乘改用迴圈:避免遞迴棧溢位 (大 x 時)。
  3. 雙精度足夠:`double` 15-16 位有效數字,單精度 `float` 會有明顯誤差。

優化版 (遞推)


double term = 1, s = 1;
for (int i = 1; ; i++) {
    term *= x / i;        // 遞推:term_i = term_{i-1} * x / i
    if (term < 0.001) break;
    s += term;
}

修正終止條件、採用遞推計算,即得高效精確的 e^x 級數求值程式。

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