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

C 語言數列部分和:精度判斷順序錯誤導致結果偏差

     編輯:程式設計疑難解答

題目

計算 1 - 1/4 + 1/7 - 1/10 + ... 直到最後一項絕對值 ≤ eps。輸入 4E-2 輸出 0.854457,輸入 0.02 輸出 0.826310。

原程式碼錯誤

do {
    k = i / j;
    i = -i;
    j += 3;
    s += k;          // 先加再判斷
} while (fabs(k) >= eps);

問題:先將當前項加入總和,再判斷是否滿足精度。當 |k| < eps 時,該項已被加入,導致結果偏大。

修正:判斷在前,累加在後

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

int main() {
    double eps;
    scanf("%lf", &eps);
    
    double sum = 0.0;
    double term = 1.0;   // 第一項 1/1
    double denom = 1.0;  // 分母
    int sign = 1;        // 正負號
    
    while (fabs(term) >= eps) {
        sum += term;           // 累加符合精度的項
        denom += 3.0;          // 分母 +3
        sign = -sign;          // 翻轉符號
        term = sign / denom;   // 計算下一項
    }
    
    printf("sum = %.6lf\n", sum);
    return 0;
}

測試驗證

輸入 eps輸出 sum說明
4E-2 (0.04)0.854457符合樣例
0.020.826310符合樣例

關鍵點

  • do-while 至少執行一次,但題目要求「直到最後一項絕對值不大於 eps」,第一項 1.0 通常大於 eps,故 while 更直觀。
  • 雙精度 double 足夠精確,題目保證不溢位。
  • 格式化輸出 %.6lf 保留六位小數。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved