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

C 語言計算 π 值:兩種循環順序導致精度差異

     編輯:程式設計綜合問答

兩種代碼對比

版本 A:先判斷項值再累加

while (fabs(n) >= 1e-6) {
    n = (pow(-1, i)) * 1 / (2*i + 1);
    pi += n;
    i++;
}

版本 B:先累加再判斷下一項

while (fabs(term) >= 1e-6) {
    pi += term;
    n += 2;
    sign = -sign;
    term = sign / n;
}

差異本質

  • 版本 A:`n` 計算的是**下一項**,判斷條件滿足時累加的是**上一項**的值。循環結束時,最後一項(`< 1e-6`)已被累加,導致多加一項。
  • 版本 B:`term` 當前項,累加後計算下一項再判斷。循環結束時,最後一項(`< 1e-6`)**未**被累加,符合「直到最後一項小於閾值停止」的語義。

修正版本 A

double pi = 0, n = 1, i = 0;
n = (pow(-1, i)) * 1 / (2 * i + 1); // 先計算第 0 項
while (fabs(n) >= 1e-6) {
    pi += n;           // 累加當前項
    i++;
    n = (pow(-1, i)) * 1 / (2 * i + 1); // 計算下一項供下輪判斷
}
pi *= 4;

結論

版本 B 邏輯更清晰,符合數學定義;版本 A 需調整循環順序使「判斷-累加-計算下一項」對齊。雙精度下最終結果差異約 `1e-6` 量級。

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