編程陷阱——浮點數舍入

在《算法競賽入門經典(第二版)》(紫書)的第二章,最後有一道思考題:

下面的程序運行結果是什麼?提示:請上機實驗,不要憑主觀感覺回答。
#include<stdio.h>
int main() {
	double i;
	for (i = 0; i != 10; i += 0.1)
		printf("%.1f\n", i);
	return 0;
}

實驗發現程序會無限循環執行下去,即使把10換成10.0也沒有用。

這就是程序的浮點數陷阱。

我們知道,計算機底層存儲數據是二進制的。如果學過計組的同學會知道,整數計算還好,小數計算會由於精度問題出現舍入,導致計算結果與真實值出現細微偏差。

也就是說,1.1 + 0.1並不一定會按照我們預想的得到1.2,也有可能會得到0.120……01

因此我們不應該依靠==對浮點數進行恆等判斷。

總結:

  1. 循環的條件變量應當是整形的。事實上它也沒有理由應該是其他類型的,難道我們要循環0.5次嗎?
  2. 在判斷兩個浮點數a和b是否相等時,不要用a==b。作爲替代,可以計算兩者之差的絕對值fabs(a-b)是否小於某個閾值,例如if(fabs(a-b) < 1e-9)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章