單精度檢視原始碼討論檢視歷史
單精度 |
單精度數是指計算機表達實數近似值的一種方式。VB中Single(單精度浮點型)變量存儲為 IEEE 32 位(4 個字節)浮點數值的形式,它的範圍在負數的時候是從-3.402823E38 到 -1.401298E-45,而在正數的時候是從 1.401298E-45到3.402823E38。
簡介
單精度浮點數用4字節存儲,雙精度浮點數用8字節存儲,分為三個部分:符號位、階和尾數。階即指數,尾數即有效小數位數。單精度格式階占8位,尾數占24位,符號位1位,雙精度則為11為階,53位尾數和1位符號位。細心的人會發現,單雙精度各部分所占字節數量比實際存儲格式多了一位,的確是這樣,事實是,尾數部分包括了一位隱藏位,允許只存儲23位就可以表示24位尾數,默認的1位是規格化浮點數的第一位,當規格化一個浮點數時,總是調整它使其值大於等於1而小於2,亦即個位總是為1。例如1100B,對其規格化的結果為1.1乘以2的三次方,但個位1並不存儲在23位尾數部分內,這個1是默認位。階以移碼的形式存儲。對於單精度浮點數,偏移量為127(7FH),而雙精度的偏移量為1023(3FFH)。存儲浮點數的階碼之前,偏移量要先加到階碼上。前面例子中,階為2的三次方,在單精度浮點數中,移碼後的結果為127+3即130(82H),雙精度為1026(402H)。
評價
單精度和雙精度數值類型最早出現在C語言中(比較通用的語言裡面),在C語言中單精度類型稱為浮點類型(float),顧名思義是通過浮動小數點來實現數據的存儲。這兩個數據類型最早是為了科學計算而產生的,他能夠給科學計算提供足夠高的精度來存儲對於精度要求比較高的數值。但是與此同時,他也完全符合科學計算中對於數值的觀念:當我們比較兩個棍子的長度的時候,一種方法是並排放着比較一下,一種方法是分別量出長度。但是事實上世界上並不存在兩根完全一樣長的棍子,我們測量的長度精度受到人類目測能力和測量工具精度的限制。從這個意義上來說,判斷兩根棍子是否一樣長絲毫沒有意義,因為結果一定是False,但是我們可以比較他們兩個哪個更長或者更短。這個例子很好地概括了單精度/雙精度數值類型的設計初衷和存在意義。你可以嘗試在任何一個控件的屬性面板中,設定他的寬度為:3.2CM,當你輸入完畢後,你會發現值自動變成了3.199cm,無論你怎麼改,你都無法輸入3.200CM,因為實際上在電腦中存儲的並不是CM為單位的數值,而是「緹」為單位的數值,而「緹」和CM之間的比值,是個很難被除盡的數,因此你輸入完畢後,電腦自動轉換成了最接近的「緹」值,然後再轉換成厘米顯示到屬性面板上,這一乘一除,兩次四捨五入,誤差就出來了。單精度/雙精度也是類似的原理,其實在二進制存儲的時候,單精度/雙精度都採用了類似相近分數的方法,而這樣的存儲是不可能做到準確的。[1]