亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

Java中浮點數的存儲格式

系統 1955 0
  當一個同事問我: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,2 11 -1],也就是[0,2047]。當0<e<2047時,它表示的指數值為e-1023;當它為0時,表示的指數值為-1022;而當e=2047時,它表示無窮大或無意義的數(這個稍后再討論)。
  現在,就剩下最后的小數部分了,也就是尾數。
  小數分為規格化數和非規格化數。規格化數的小數點左邊隱含了1,而非規格化數小數點左邊是0。小數點左邊隱含1有什么好處呢?我們知道,任何一個小數都可以用科學計數法表示:一個數可以表示成 a×10 n 的 形式,其中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 )
(完)

Java中浮點數的存儲格式


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 国产夜夜操 | 久久国产一区二区 | 国产99视频精品免费视频7 | 在线 v亚洲 v欧美v 专区 | 国产成 人 综合 亚洲网 | julia中文字幕在线 | 无遮挡又黄又爽又色1000部 | 国产精品久久久久久久小唯西川 | 美女羞羞视频网站 | 国产亚洲精aa在线观看香蕉 | 久久久国产一区二区三区 | 97精品久久天干天天蜜 | 久久国产国内精品对话对白 | 亚洲乱码一区二区三区国产精品 | 水浒传删减剧情在线观看 | 特级无码a级毛片特黄 | 真91视频 | 久久www免费人成看片入口 | 男女乱淫真视频免费一级毛片 | 久久国产精品高清一区二区三区 | 99热久久国产精品这里有99 | 深夜福利免费在线观看 | 一级a毛片免费 | 久草手机视频 | 高清不卡视频 | 欧美日韩精品一区二区三区 | 综合亚洲精品一区二区三区 | 久热免费 | 福利视频网站 | 久久久小视频 | 久久亚洲精品中文字幕二区 | 一级免费a| 嘿咻成人免费视频欧美激情 | 毛片电| 亚洲国产欧美国产综合一区 | 一级一级毛片看看 | 国产免费人视频在线观看免费 | 80岁色老头69av | 动漫精品一区二区 | 亚洲欧美精品 | 亚洲射图 |