資源描述:
《單精度和雙精度的區(qū)別》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在應(yīng)用文檔-天天文庫。
1、單精度和雙精度的區(qū)別單精度和雙精度數(shù)值類型最早出現(xiàn)在C語言中(比較通用的語言里面),在C語言中單精度類型稱為浮點(diǎn)類型(Float),顧名思義是通過浮動(dòng)小數(shù)點(diǎn)來實(shí)現(xiàn)數(shù)據(jù)的存儲(chǔ)。這兩個(gè)數(shù)據(jù)類型最早是為了科學(xué)計(jì)算而產(chǎn)生的,他能夠給科學(xué)計(jì)算提供足夠高的精度來存儲(chǔ)對于精度要求比較高的數(shù)值。但是與此同時(shí),他也完全符合科學(xué)計(jì)算中對于數(shù)值的觀念:?當(dāng)我們比較兩個(gè)棍子的長度的時(shí)候,一種方法是并排放著比較一下,一種方法是分別量出長度。但是事實(shí)上世界上并不存在兩根完全一樣長的棍子,我們測量的長度精度受到人類目測能力和測量工具精度的限制。從這個(gè)意義上來說,判斷兩根棍子是否一樣長絲毫沒有意
2、義,因?yàn)榻Y(jié)果一定是False,但是我們可以比較他們兩個(gè)哪個(gè)更長或者更短。這個(gè)例子很好地概括了單精度/雙精度數(shù)值類型的設(shè)計(jì)初衷和存在意義。?基于上述認(rèn)識(shí),單精度/雙精度數(shù)值類型從一開始設(shè)計(jì)的時(shí)候,就不是一個(gè)準(zhǔn)確的數(shù)值類型,他只保證在他這個(gè)數(shù)值類型的精度之內(nèi)是準(zhǔn)確的,精度之外則不保證,比方說,一個(gè)數(shù)值5.1,很可能存儲(chǔ)在單精度/雙精度數(shù)值中的實(shí)際值是5.100000000001或者5.09999999999999。導(dǎo)致這個(gè)現(xiàn)象的原因我們可以通過兩種方式來解釋:?簡單的解釋方法:?你可以嘗試在任何一個(gè)控件的屬性面板中,設(shè)定他的寬度為:3.2CM,當(dāng)你輸入完畢后,你會(huì)發(fā)現(xiàn)
3、值自動(dòng)變成了3.199cm,無論你怎么改,你都無法輸入3.200CM,因?yàn)閷?shí)際上在電腦中存儲(chǔ)的并不是CM為單位的數(shù)值,而是“緹”為單位的數(shù)值,而“緹”和CM之間的比值,是個(gè)很難被除盡的數(shù),因此你輸入完畢后,電腦自動(dòng)轉(zhuǎn)換成了最接近的“緹”值,然后再轉(zhuǎn)換成厘米顯示到屬性面板上,這一乘一除,兩次四舍五入,誤差就出來了。單精度/雙精度也是類似的原理,其實(shí)在二進(jìn)制存儲(chǔ)的時(shí)候,單精度/雙精度都采用了類似相近分?jǐn)?shù)的方法,而這樣的存儲(chǔ)是不可能做到準(zhǔn)確的。?深入的解釋方法:?讓我們來看看我們存儲(chǔ)到數(shù)字介質(zhì)中的單精度/雙精度值到底是怎么樣的,我們使用如下代碼對單精度類型進(jìn)行一個(gè)解剖:
4、?PublicDeclareSubCopyMemoryLib"kernel32"Alias"RtlMoveMemory"(DestinationAsAny,SourceAsAny,ByValLengthAsLong)?PublicSubfloatTest()?DimdblVarAsSingle?dblVar=5.731/8?dblOutputdblVar?dblVar=dblVar*2?dblOutputdblVar?dblVar=dblVar*2?dblOutputdblVar?dblVar=dblVar*2?dblOutputdblVar?dblVar=dbl
5、Var*2?dblOutputdblVar?dblVar=dblVar*2?dblOutputdblVar?EndSub?PublicSubdblOutput(ByValdblVarAsSingle)?DimbytVar(3)AsByte?DimiAsInteger,jAsInteger?DimstrVarAsString?CopyMemoryByValVarPtr(bytVar(0)),ByValVarPtr(dblVar),4?strVar=dblVar&":"?Fori=3To0Step-1?Forj=7To0Step-1?strVar=strVar&(by
6、tVar(i)And2^j)/2^j?Nextj?strVar=strVar&""?Nexti?Debug.PrintstrVar?EndSub?運(yùn)行后我們得到輸出結(jié)果(輸出格式為高位左,低位右):?.716375:00111111001101110110010001011010?1.43275:00111111101101110110010001011010?2.8655:01000000001101110110010001011010?5.731:01000000101101110110010001011010?11.462:01000001001101110
7、110010001011010?22.924:01000001101101110110010001011010?這里,我們把單精度類型轉(zhuǎn)化成了二進(jìn)制數(shù)據(jù)輸出,這里我們看到,雖然這六個(gè)數(shù)字完全不同,但是他們的二進(jìn)制存儲(chǔ)驚人地相似,我們看到紅色標(biāo)記部分,每次都是加1,事實(shí)上,單精度數(shù)據(jù)類型使用從高位開始第1位作為正負(fù)標(biāo)記位(綠色),第2位到第9位,是一個(gè)跨字節(jié)的有符號(hào)字節(jié)類型數(shù)據(jù),這個(gè)數(shù)值決定了小數(shù)點(diǎn)移動(dòng)的方向和位數(shù)(紅色),第10位到32位保存一個(gè)整數(shù)(藍(lán)色)在存儲(chǔ)過程中,電腦首先把輸入的值不斷移位(乘除2)直到這個(gè)數(shù)的整數(shù)部分占用了全部24位的整數(shù)位,然后把移動(dòng)的
8、位數(shù)寫入浮