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

C 語言浮點數迴圈輸出順序異常與精度誤差分析

     編輯:程式設計綜合問答

代碼使用 double i 作為迴圈計數器,步長 0.1,並連續三次 printf 輸出同一變數,觀察到輸出順序「顛倒」與數值異常。

現象 1:輸出順序看似顛倒

實際上順序不變,是終端機緩衝區特性誤導。三個 printf 依序執行,但標準輸出默認**行緩衝**(遇換行刷新)或**全緩衝**(重定向時)。若格式字串不含 \n 或刷新不及時,輸出會混雜顯示。建議每次 printf 結尾加 \n 或調用 fflush(stdout)。

現象 2:浮點數精度誤差

for (i = 0; i <= 10.1; i += 0.1) // 錯誤示範

0.1 在二進位無法精確表示(類似十進位 1/3),累加產生誤差:i 可能為 1.0999999、1.2000001 等。導致:

  • 迴圈次數不確定(可能多跑或少跑一次)。
  • printf("%.1lf", i) 四捨五入顯示 1.1,但 %lf 顯示完整誤差值。
  • (int)i 截斷向零取整,產生非預期整數。

正確做法:整數迴圈 + 縮放

for (int step = 0; step <= 101; ++step) {
    double i = step * 0.1; // 或 step / 10.0
    printf("%.1lf\n%lf\n%d\n", i, i, (int)i);
    if (i >= 9.9) break;
}
  • 用整數 step 控制迴圈,完全避免累積誤差。
  • 每次計算 i 由精確整數轉換,數值穩定。

總結

  1. **永遠不用浮點數作為迴圈計數器/步長**。
  2. 輸出順序問題源於緩衝區,加換行符解決。
  3. 浮點數比較 (i >= 9.9) 需用容差:fabs(i - 9.9) < 1e-9。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved