for (double i = 0; i != 10; i += 0.1)
printf("%.1lf\n", i); // 無限循環!
0.1 (十進制) = 0.0001100110011... (二進制無限循環)
double 52位尾數截斷後 ≈ 0.10000000000000000555
累加100次誤差累積 → i 永遠 != 10.0
FLT_EPSILON (float) ≈ 1.19e-7DBL_EPSILON (double) ≈ 2.22e-16|a-b| <= max(|a|,|b|) * EPSILONfor (int i = 0; i <= 100; i++) {
double val = i * 0.1; // 或 val = i / 10.0
printf("%.1lf\n", val);
}
for (double i = 0; i <= 10.0 + 1e-9; i += 0.1) // 留容差
// 或
for (double i = 0; i < 10.0 - 1e-9; i += 0.1)
// 縮放100倍用整數
for (int i = 0; i <= 1000; i++) {
printf("%.2f\n", i / 100.0);
}
nextafter 精確步進 (C99)double i = 0, target = 10.0;
while (i <= target) {
printf("%.1lf\n", i);
i = nextafter(i + 0.1, target); // 朝target方向最近的可表示值
}
_Decimal64 (十進制浮點)BigDecimaldecimal.Decimal這涉及停機問題與浮點數確定性語義:雖然IEEE 754規範了運算行為,但誤差累積路徑依賴於具體指令序列、優化級別、CPU指令集(x87 vs SSE)。編譯器可能將迴圈展開、向量化、使用FMA指令,導致中間結果精度不同。唯有在目標平台實測才能確定具體行為。