為什麼計算機對浮點型數字計算存在誤差?
我們輸入的十進位制小數在計算機中都是以二進位制進行儲存。比如:
我們把0.25轉換為二進位制
0.25 * 2 = 0.5 取0
0.50 * 2 = 1.0 取1
所以十進位制0.25的二進位制應當為0.01
但是我們把0.3轉換為二進位制儲存
0.3 * 2 = 0.6 取0
0.6 * 2 = 1.2 取1
0.2 * 2 = 0.4 取0
0.4 * 2 = 0.8 取0
0.8 * 2 = 1.6 取1
0.6 * 2 = 1.2 取1
0.2 * 2 = 0.4 取0
......
所以十進位制0.3的轉為二進位制應當為0.01001100110011的無限迴圈小數。
由此可見0.3在計算機中儲存的值永遠小於0.3,所以當使用0.3計算時,就會產生誤差。
在計算機中浮點型不能直接使用等號比較也是同一個道理。舉個李子:
#include<stdio.h>
void comp(double a, double b){
printf("兩個數:a = %g, b = %g 開始比較\n", a, b);
if(a == b){
printf("a equal b\n");
}
else{
printf("a not equal b\n");
printf("a - b = %g\n", a - b);
}
}
int main(){
comp(0.25 + 0.25 + 0.25 + 0.25, 1.0);
comp(0.3 + 0.3, 0.6);
comp(0.3 + 0.3 + 0.3 + 0.1, 1);
return 0;
}
執行結果:
可以看出當涉及到0.3的運算超出一定的精度後,就會計算錯誤。
這就是為什麼浮點型運算在計算機中會存在誤差的原因。