如何理解IEEE 754標準對Java中float值和double值的規定

來源:互聯網
上載者:User

標籤:sign   電子   eric   符號   技術   ima   表示   tps   第一個   

在Java語言中,我們可以使用float和double這兩種基礎資料型別 (Elementary Data Type)來表示特定的資料。

這兩種資料類型,本質上是浮點數(floating-point number),浮點是一種對於實數的近似值數值表現法,由一個有效數字加上冪數來表示。

之所以使用浮點數,是因為電腦在使用二進位運算的過程中,無法將所有的十進位小數準確的換算為二進位,只能使用近似值來表示。

使用浮點數表示數值的方法很多,在Java中,和C語言一樣,float和double都採用了使用最為廣泛的IEEE 754標準。

IEEE 754標準的全稱為IEEE二進位浮點數算術標準(ANSI/IEEE Std 754-1985),其中ANSI是美國國家標準局(American National Standards Institute)的縮寫,IEEE是電器電子工程師學會(Institute of Electrical and Electronics Engineers)的縮寫,754是該標準的編號,1985則是該標準發布的年份。

 IEEE 754規定,一個二進位浮點數在儲存中由三部分組成:

 其中第一部分為符號位(sign bit),第二部分為指數位移值(exponent bias)用於儲存浮點數的指數部分,第三部分為分數(fraction)用於儲存浮點數的有效數的小數部分。

以一個具體的float值為例,Java中的float值採用的是IEEE754中的單精確度標準,使用32個位元進行儲存。例如:

0100 0100 1010 0110 1001 1110 0000 0000

其中:

0100 0100 1010 0110 1001 1110 0111 0100

第一位的0為符號位,它表示這個數的正負值為正,相應的,若第一位為1則表示這是一個負數;

0100 0100 1010 0110 1001 1110 0000 0000

第2~9的8個位元儲存的是指數位移值,用於記錄該float值的指數部分,取值範圍為-126~+127再加上位移值127(2的7次方減1),結果就是1~254(0和255留作特殊值)。在本例中,1000 1001在十進位中的值為137,但是137是進行位移後的結果,減去位移值127後,其實際代表的指數值就是10。

0100 0100 1010 0110 1001 1110 0000 0000

第10~32的23個位元儲存的是該float值的分數/小數部分。010 0110 1001 1110 0000 0000實際上表示的就是二進位的0.010 0110 1001 1110 0000 0000再加上1,也就是1.010 0110 1001 111。這實際上就是二進位的1010 0110 1001 111右移十四位的結果。1010 0110 1001 111在十進位中的值為21327,所以1.010 0110 1001 111也就等於21327*2^(-14)。

綜上,例子中的:

0100 0100 1010 0110 1001 1110 0000 0000

實際上也就等於:

            +        21327*2^(-14)   *   2^10    =  1332.9375

第一位符號位表示        第10~32的分數位表示  第2~9的指數位表示

 

反之,例如我們想知道某個float a = 1000在記憶體中的形式,那麼則需要如下操作:

首先,1000是個整數,所以第一個位元位儲存的是0。

十進位的100在二進位中為11 1110 1000,這實際上就是1.111101左移9位的結果,
那麼實際上指數位儲存的結果就應該是9 + 127 = 136也就是1000 1000

分數位儲存的則是1.111101減去1的部分,補齊23位,也就是111 1010 0000 0000 0000 0000

綜上float a = 1000在記憶體中的儲存為:

0100 0100 0111 1010 0000 0000 0000 0000

 

 

另外,前面提到過的,指數位移值為0或255的時候代表特殊值:

當指數值為0,即0000 0000時,若小數部分為0,則這個數為±0(正負由符號位決定);

當指數值為255,即1111 1111時,若小數部分為零,則這個數為±∞(正負由符號位決定);

當指數值為255,即1111 1111時,若小數部分非零,則這個數表示為不是一個數(Not a Number)。

 

以上就是float的部分,double同理,只不過double採用IEEE 754雙精確度標準,使用64個位元儲存,其中2~12的11位為指數位,13~64的52位為小數位。

 

References:

IEEE 754 - wiki
https://zh.wikipedia.org/zh-cn/IEEE_754

浮點數 - wiki
https://zh.wikipedia.org/zh-cn/%E6%B5%AE%E7%82%B9%E6%95%B0

如何理解IEEE 754標準對Java中float值和double值的規定

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.