電子計(jì)算機(jī)里的浮點(diǎn)運(yùn)算和持續(xù)精確的數(shù)學(xué)運(yùn)算是不同的。數(shù)學(xué)中,所有的數(shù)都可以精確表示。但就如前面的章節(jié)所示,在電子計(jì)算機(jī)里,許多數(shù)不能用有限個(gè)比特位來描述。所有的計(jì)算都在一定的精度下執(zhí)行。在這節(jié)的例子中,為了簡單化,將使用8位的有效數(shù)。
加法
要將兩個(gè)浮點(diǎn)數(shù)相加,它們的指數(shù)必須是相等的。如果它們并不相等,那么通過移動(dòng)較小指數(shù)的數(shù)的有效數(shù)來使它們相等。例如:考慮10.375 +6.34375 = 16.71875或在十進(jìn)制中:
這兩個(gè)數(shù)字的指數(shù)不一樣,所以通過移動(dòng)有效數(shù)使指數(shù)相同,然后再相加:
注意,移位丟掉了

中的末尾的1,經(jīng)過四舍五入后得


。加法的結(jié)果,

等于10000.110?或16.75。這個(gè)數(shù)并不等于準(zhǔn)確的答案(16.71875)!它只是一個(gè)近似值,是在進(jìn)行加法操作時(shí)四舍五入后的應(yīng)有誤差。
認(rèn)識到在電子計(jì)算機(jī)(或計(jì)算器)里的浮點(diǎn)運(yùn)算得到的結(jié)果經(jīng)常是近似值是非常重要的。對于電子計(jì)算機(jī)里的浮點(diǎn)運(yùn)算,算術(shù)法則不總是對的。算術(shù)中假定的無窮精度是任何電子計(jì)算機(jī)都無法做的。例如,算術(shù)法則告訴我們(a + b) - b = a;但是,在電子計(jì)算機(jī)里,并不能完全保證它正確。
減法
減法和加法一樣運(yùn)作,而且有和加法一樣的問題。作為一個(gè)例子,考慮16.75 - 15.9375 = 0.8125:
移位1.1111111 X 23后得到(四舍五入) 1.0000000 X

0.0000110 X

= 0.11? = 0.75 它并不完全正確的。
乘法和除法
對于乘法,有效數(shù)執(zhí)行乘法操作而指數(shù)執(zhí)行相加操作??紤]10.375 X 2.5 = 25.9375:
當(dāng)然,真正的結(jié)果需四舍五入成8位,得:
1.1010000 X

= 11010.0002 = 26
除法更復(fù)雜,但是也有同樣的四舍五入的誤差問題。
分支程序設(shè)計(jì)
這一節(jié)的重點(diǎn)是浮點(diǎn)運(yùn)算的結(jié)果并不準(zhǔn)確。程序員必須意識到這點(diǎn)。一個(gè)程序員經(jīng)常犯的浮點(diǎn)運(yùn)算錯(cuò)誤就是在假定一個(gè)運(yùn)算是精確的情況下,用它們?nèi)ケ容^。例如,考慮一個(gè)執(zhí)行復(fù)雜運(yùn)算的f(x)函數(shù)和一個(gè)求這個(gè)函數(shù)的根的程序。你可能會試圖用下面的語句來檢查x是不是一個(gè)根:
if ( f (x) == 0.0 )
但是,如果f (x)返回1X

又該怎么辦呢?這個(gè)數(shù)的最合適的含義是x是一個(gè)實(shí)根的非常好的近似值??赡軟]有一個(gè)IEEE浮點(diǎn)值x能恰好返回0,因?yàn)閒 (x)的四舍五入誤差。
一個(gè)比較好的方法是使用:
if ( fabs( f (x)) < EPS )
其中的EPS是一個(gè)宏,定義為一個(gè)非常小的正數(shù)(比如說

)。當(dāng)f (x)非常接近0時(shí),它就為真。一般來說,一個(gè)浮點(diǎn)數(shù)(譬如x)和另一個(gè)浮點(diǎn)數(shù)(y)的比較,需使用:
if ( fabs(x ? y)/fabs(y) < EPS )
更多建議: