代碼:
for (double y = 0.1; y != 1.0; y += 0.1)
cout << y << endl;
現象:循環不會在 1.0 停止,繼續跑到 1.1、1.2…
y 實際約為 0.9999999999999999 或 1.0000000000000001,永遠不等於 1.0。y != 1.0 恆真,循環無限執行。for (int i = 1; i <= 10; ++i) {
double y = i * 0.1;
cout << y << endl;
}
const double EPS = 1e-9;
for (double y = 0.1; y < 1.0 + EPS; y += 0.1) { ... }
fabs(a-b) < EPS。BigDecimal (Java) 或定點數/整數分/厘。理解 IEEE 754 浮點數表示誤差,是寫出健壯數值代碼的前提。