為什么計算機對浮點型數(shù)字計算存在誤差?
我們輸入的十進(jìn)制小數(shù)在計算機中都是以二進(jìn)制進(jìn)行存儲。比如:
我們把0.25轉(zhuǎn)換為二進(jìn)制
0.25 * 2 = 0.5 取0
0.50 * 2 = 1.0 取1
所以十進(jìn)制0.25的二進(jìn)制應(yīng)當(dāng)為0.01
但是我們把0.3轉(zhuǎn)換為二進(jìn)制存儲
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
......
所以十進(jìn)制0.3的轉(zhuǎn)為二進(jìn)制應(yīng)當(dāng)為0.01001100110011的無限循環(huán)小數(shù)。
由此可見0.3在計算機中存儲的值永遠(yuǎn)小于0.3,所以當(dāng)使用0.3計算時,就會產(chǎn)生誤差。
在計算機中浮點型不能直接使用等號比較也是同一個道理。舉個李子:
#include<stdio.h>
void comp(double a, double b){
printf("兩個數(shù):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;
}
執(zhí)行結(jié)果:
可以看出當(dāng)涉及到0.3的運算超出一定的精度后,就會計算錯誤。文章來源:http://www.zghlxwxcb.cn/news/detail-410905.html
這就是為什么浮點型運算在計算機中會存在誤差的原因。文章來源地址http://www.zghlxwxcb.cn/news/detail-410905.html
到了這里,關(guān)于為什么計算機對浮點型數(shù)字計算存在誤差的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!