計算調和級數 1 + 1/2 + 1/3 + ... 何時超過 15.0。原代碼輸出 1835422,正確答案為 1835421。
for(i=1; s<15.0; i++) s+=1.0/i;
printf("%ld", i); // 迴圈結束時 i 已多增 1
當 s >= 15.0 滿足退出條件時,i++ 已執行,導致結果偏大 1。
for(i=1; ; i++) {
s += 1.0/i;
if(s > 15.0) break;
}
printf("%ld", i); // 此時 i 為恰好使和超過 15.0 的項數
調和級數第 n 項和 H_n ≈ ln(n) + γ (γ≈0.577)。解 ln(n) + 0.577 > 15 得 n > e^14.423 ≈ 1.83e6,與結果吻合。
大規模求和時,由小到大累加(避免大數吃小數精度損失),或使用 Kahan 求和演算法提升精度。