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

C 語言級數求和:1 + 1/1! + 1/2! + ... 直到項 < 1e-6,邊界條件與浮點精度詳解

     編輯:程式設計綜合問答

題目要求

計算 S = 1 + 1/1! + 1/2! + 1/3! + ... + 1/n!,直到 **最後一項 < 1e-6 (0.000001)** 停止。注意:1/0! 即首項 1 通常包含在內,但題目寫法「1+1/1!+1/2!+...」暗示從 1/1! 開始累加,首項 1 單獨列出。兩種理解結果相近(差 1),代碼中以「項值 < 1e-6 為終止條件」為準。

錯誤代碼剖析

double a=1, b=0, c=1, e=0;
while (b >= 1e-6) {  // ❌ b 初始為 0,條件不成立,循環零次執行
    c = c * a;       // 階乘分母
    a = a + 1;
    b = 1 / c;       // 當前項值
    e = e + b;       // 累加和
}
printf("%f\n", e);   // 輸出 0.000000

核心錯誤:b 初始化為 0,`while (b >= 1e-6)` **初次判斷即為假**,循環體**一次不執行**,e 保持 0。

正確代碼(兩種等價寫法)

寫法一:do-while 保證至少執行一次

#include <stdio.h>
int main() {
    double term = 1.0;  // 當前項值,從 1/0! = 1 開始
    double sum = 1.0;   // 累加和,含首項 1
    int n = 1;          // 分母階乘基數
    double fact = 1.0;  // 階乘值

    do {
        fact *= n;          // n!
        term = 1.0 / fact;  // 1/n!
        sum += term;        // 累加
        n++;
    } while (term >= 1e-6); // 項值 >= 1e-6 繼續

    printf("Sum = %.10f\n", sum);  // 輸出 ~2.718281828 (e)
    return 0;
}

寫法二:while 先計算項值再判斷

#include <stdio.h>
int main() {
    double sum = 1.0;   // 首項 1
    double fact = 1.0;
    int n = 1;
    double term;

    while (1) {
        fact *= n;           // 計算 n!
        term = 1.0 / fact;   // 計算 1/n!
        if (term < 1e-6) break;  // 項值過小,終止
        sum += term;         // 累加
        n++;
    }
    printf("Sum = %.10f\n", sum);
    return 0;
}

關鍵點總結

問題解決
循環零次執行初始化項值滿足條件,或用 do-while
階乘溢出用 double 存儲 fact,17! 以上超過 long long 範圍,double 可表示至 170!
浮點精度1e-6 為雙精度常量,double 計算足夠;最終和趨近 e ≈ 2.718281828459045
題目「N 不小於 10 的 -6 次方」即項值 < 10^-6 = 1e-6,與代碼一致

數學驗證

該級數為 e^x 在 x=1 的泰勒展開:e = Σ 1/n! (n=0..∞)。
程序輸出應接近 2.718281828。若只加到 1/9! (≈2.75e-6),和約 2.718279;加到 1/10! (≈2.75e-7) 則更精確。

總結

初始化邊界變量使循環條件**首次判斷為真**,或用 do-while 結構。double 足夠勝任階乘與求和,無需 long double。核心邏輯:**先計算本項,判斷是否加入,再遞推下一項**。

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