為什麼計算機對浮點型數字計算存在誤差

廊虞發表於2023-04-11

為什麼計算機對浮點型數字計算存在誤差?

我們輸入的十進位制小數在計算機中都是以二進位制進行儲存。比如:

我們把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;
}

執行結果:

img

可以看出當涉及到0.3的運算超出一定的精度後,就會計算錯誤。

這就是為什麼浮點型運算在計算機中會存在誤差的原因。

相關文章