以下爲複製粘貼過來的文章內容:
陷阱1
[cpp] view plaincopyprint?
double i;
for(i = 0; i != 10; i += 0.1)
printf("%.1lf\n", i);
程序會打印至10.0時結束循環嗎?不會。因爲i永遠也不可能等於10,這是個無限循環
陷阱2
[cpp] view plaincopyprint?
if(0.1+0.1+0.1 == 0.3)
printf("equal\n");
else
printf("not equal\n");
會輸出"equal"嗎?不會。實際浮點數運算時,0.1+0.1+0.1 != 0.3
產生上述陷阱的原因
實際上,計算機中的所有數據都用二進制表示,包括浮點數。這就導致某些浮點數不能用二進制精確表示,例如0.1(這很容易理解,就像10/3不能被十進制精確表示一樣)
進一步地說,浮點數是採用分數+指數來表示的,例如
0.5 = 1/2
0.75 = 1/2 + 1/(2^2)
0.875 = 1/2 + 1/(2^2) + 1/(2^3)
0.1 = 1/(2^4) + 1/(2^5) + 1/(2^8) + ...
其中0.1只能無限循環下去,這就意味着0.1在計算機中不能被精確表示,因此產生上述兩個陷阱也就很容易理解