Java中浮點數的儲存格式

來源:互聯網
上載者:User
  當一個同事問我:Java中的double的取值範圍是多少時,我一臉的茫然,除了知道浮點數由符號位、指數位和小數位組成之外,其它的一無所知。大學裡《電腦群組成》中學的東西也忘得一乾二淨。
  查了一些資料,並親手寫了些測試代碼,總算弄明白了,在此做個筆記。  1.三種儲存格式  Java遵循的是IEEE 754 規範。在這個規範裡,提到了浮點數的三種類型:單精確度、雙精確度和雙精確度擴充。
  這三種類型的浮點數的儲存都由三部分組成:符號位、指數位和小數位組成,不同的是三者指數位和小數位的位元不一樣。
  IEEE 單精確度格式具有24 位有效數字精度,並總共佔用32 位。IEEE 雙精確度格式具有53 位有效數字精度,並總共佔用64 位元。至於雙精確度擴充,IEEE規定它至少具有64 位元有效數字精度,並總共佔用至少79 位。

2.雙精確度格式  現在,我們僅僅對雙精確度浮點數,也就是double進行分析,其它的兩種可以此類推,不必贅述。
  IEEE 雙精確度格式由三部分組成:52位小數f ;11 位偏置指數e ;以及1 位符號s。
  這些欄位連續儲存在兩個32 位字中。如所示:

  將這兩個連續的32 位字按一個64 位元字那樣進行了編號,其中0:51 位儲存52 位的小數f ; 52:62 位儲存11 位偏置指數e ;而第63 位儲存符號位s。
  s為0表示整數,1則為負數。
  e[52:62]總共11位表示偏置指數,也就是階碼部分。它是一個無符號數,取值範圍是[0,211-1],也就是[0,2047]。當0<e<2047時,它表示的指數值為e-1023;當它為0時,表示的指數值為-1022;而當e=2047時,它表示無窮大或無意義的數(這個稍後再討論)。
  現在,就剩下最後的小數部分了,也就是尾數。
  小數分為規格化數和非規格化數。規格化數的小數點左邊隱含了1,而非規格化數小數點左邊是0。小數點左邊隱含1有什麼好處呢?我們知道,任何一個小數都可以用科學計數法表示:一個數可以表示成 a×10n的 形式,其中1≤a<10,n為整數。在十進位裡,a的整數部分必定是1-9的整數。而在二進位裡,a的整數部分就只能是1了。既然必定是1,那麼為這個常 量浪費1位儲存空間顯然不划算了,不如省掉,因此1就隱含了。這也就是為什麼0<e<2047時,小數部分使用規格化數的原因。
  那麼為什麼當e=0時,它的小數部分又是非規格化數呢?原因很簡單,如果此時也用規格化數,那麼它的取值範圍必定會出現斷層。也就是說,在最大值和最小值之間,還有部分數字取值範圍的數字無法表示。
  上面,我們提到了當e=2047時,它表示無窮大或無意義的數。如果此時,小數部分全0,它就是無窮大,至於是正無窮大還是負無窮大由符號位決定,如果小數部分至少有1位不為0,那麼它就是無意義的數。
  用圖表表示如下:

  雙精確度儲存格式位元模式及其IEEE 值的位元模式的對應關係可參見下表:
  中的無意義數(NaN,非數)的位元模式只是可表示NaN的眾多位元模式中的一種而已。另外,我們注意到,儘管+0和-0的十進位值是相等的,但它們的位元模式卻不一樣。  3.程式碼範例  既然對儲存格式已經瞭解清楚了,我們可以通過編寫代碼來加深對浮點數儲存的理解。
  Java中的類Double封裝了 double的操作,我們很容易通過Double來操作double. 函數Double.longBitsToDouble()可以把給定的位元模式轉換成double。如果要驗證十六進位的 0x7fefffffffffffff位元模式是不是十進位的,這個很容易,只需要如下兩行代碼:       double value = Double.longBitsToDouble(0x7fefffffffffffffL);   
       System.out.println(value);我們可以看到,輸出結果是:        1.7976931348623157E308這與我們期望中的也是吻合的。  其它的例子我就不逐一示範,這兒我附上代碼的連結。〈下載〉 參考資料:
1.IEEE Standard 754 for Binary Floating-Point Arithmetic
2.Numerical Computation Guide(http://gceclub.sun.com.cn/TT/sunstudio/NCG/819-4817-10.pdf)(完)
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.