資源描述:
《浮點(diǎn)數(shù)的表示和精度》由會員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫。
1、浮點(diǎn)數(shù)的表示和精度(2009-12-1717:03:57)轉(zhuǎn)載標(biāo)簽:it分類:C/C++如果a>0,那么1+a一定大于1嗎?在數(shù)學(xué)上,答案是肯定的。但在計(jì)算機(jī)上,答案就與a的大小和浮點(diǎn)數(shù)的精度有關(guān)了。在matalb上,可以作以下計(jì)算:>>a=1/2^52a=???2.220446049250313e-016>>1+a>1ans=????1>>a=1/2^53a=???1.110223024625157e-016>>1+a>1ans=????0可見,當(dāng)a等于1/2^53時(shí),1+a>1是不成立的。1浮點(diǎn)數(shù)IEEE754定義了單
2、精度浮點(diǎn)數(shù)和雙精度數(shù)浮點(diǎn)數(shù),即float和double。float有32bit,double有64bit。它們都包括符號位、指數(shù)和尾數(shù)。???符號位???指數(shù)???尾數(shù)float???31(1)???30-23(8)???22-0(23)double???63(1)???62-52(11)???51-0(52)符號位有1bit,0表示正、1表示負(fù)。設(shè)一個(gè)數(shù)的指數(shù)是e,指數(shù)部分的值是bias+e。加上一個(gè)bias是為了表示負(fù)數(shù)。float的bias是127,double的bias是1023。指數(shù)全0或全1有特殊含義,不算正常
3、指數(shù)。???*float的指數(shù)部分有8bit,可以取值1~254,減掉127,得到對應(yīng)的指數(shù)范圍-126~127。???*double的指數(shù)部分有11位,可以取值1~2046,減掉1023,得到對應(yīng)的指數(shù)范圍-1022~1023。這里的指數(shù)是以2為底的,同樣尾數(shù)也是二進(jìn)制的。IEEE754要求浮點(diǎn)數(shù)以規(guī)范形式存儲,即小數(shù)點(diǎn)前有1位非零數(shù)字。對于二進(jìn)制數(shù),非零數(shù)字只有1。所以IEEE754在存儲時(shí)省略了這個(gè)小數(shù)點(diǎn)前面的1,只存儲小數(shù)點(diǎn)后面的位。2誤差看個(gè)例子,設(shè):?doublea=0.2;在PC上,我們可以看到a對應(yīng)的存儲區(qū)
4、數(shù)據(jù)是:9A9999999999C93FPC的數(shù)據(jù)是小尾的,即低位字節(jié)在后,將其寫成高位字節(jié)在前,得到:3FC999999999999A可見符號位為0。指數(shù)位是0x3FC,即1020,減掉1023,得到指數(shù)-3。尾數(shù)是999999999999A。所以完整的數(shù)字就是16進(jìn)制的1.999999999999A乘上2^-3。即:a=(1+9*(1/16+1/16^2+...+1/16^12)+10/16^13)*2^-3(1/16+...+1/16^12)可以用等比級數(shù)求和公式a1*(1-q^n)/(1-q)計(jì)算,其中a1=1/1
5、6,q=1/16,n=12,因此:a=(1+9*(1-1/16^12)/15+10/16^13)*2^-3用windows的計(jì)算器計(jì)算上式,得到a=0.20000000000000001110223024625157這也不是精確解,但已經(jīng)可以看到用double表示0.2時(shí)存在的誤差。這個(gè)例子說明在用有限字長的二進(jìn)制浮點(diǎn)數(shù)表示任意實(shí)數(shù)a可能引入誤差。設(shè)實(shí)數(shù)a的指數(shù)為e,尾數(shù)位數(shù)為n,顯然:誤差<(1/2^n)*2^e3精度可以把機(jī)器精度定義為滿足條件fl(1+ε)>1的最小浮點(diǎn)數(shù)ε。其中fl(1+ε)是1+ε的浮點(diǎn)表示。顯然
6、double的機(jī)器精度是1/2^52。float的機(jī)器精度是1/2^23。matlab內(nèi)部采用double,1+1/2^53對double來說就是1,所以1+1/2^53不會大于1。對于規(guī)范數(shù)來說,因?yàn)樾?shù)點(diǎn)前默認(rèn)有個(gè)1,所以float的有效數(shù)字是24bit,對應(yīng)8位十進(jìn)制有效數(shù)字;double的有效數(shù)字是53bit,對應(yīng)16位十進(jìn)制有效數(shù)字。4特殊的浮點(diǎn)數(shù)前面提到浮點(diǎn)數(shù)的指數(shù)全0或全1有特殊含義,讓我們來看看這些特殊的浮點(diǎn)數(shù):???*指數(shù)和尾數(shù)都是全0表示0。根據(jù)符號位不同可以分為+0和-0。???*指數(shù)全0,尾數(shù)不為全
7、0,這些數(shù)是非規(guī)范數(shù),即尾數(shù)部分不假設(shè)前面存在小數(shù)點(diǎn)前的1?;蛘哒f這些數(shù)太接近0了,因?yàn)橹笖?shù)已經(jīng)不能再小,所以這些數(shù)不能寫成規(guī)范形式。例如:double數(shù)0000000000000001的尾數(shù)是0000000000001,即1/2^52,對應(yīng)的數(shù)是1/(2^52)*2^-1022,即4.9406564584124654e-324。???*指數(shù)全1,尾數(shù)全0表示無窮大,即inf。根據(jù)符號位不同可以分為+inf和-inf。???*指數(shù)全1,尾數(shù)不為全0表示NaN,即NotaNumber,不是數(shù)。尾數(shù)最高位為1的NaN被稱作QN
8、aN(QuietNaN)。尾數(shù)最高位為0的NaN被稱作SNaN(SignallingNaN)。通常用QNaN表示不確定的操作,用SNaN表示無效的操作。在計(jì)算機(jī)內(nèi)部,double就是一個(gè)64位數(shù)。從0x0000000000000000~0xFFFFFFFFFFFFFFFF,每個(gè)64位數(shù)都對應(yīng)一個(gè)浮點(diǎn)數(shù)或