java 小數轉換成二進制


32位單精度二進制 = [1個符號位] [8個階碼位] [23個尾數位]

64位單精度二進制 = [1個符號位] [11個階碼位] [52個尾數位]

小數 = [正負符號位]  [整數部分] . [小數部分] 

8位階碼位移碼偏移量127,11位階碼位移碼偏移量1023

 

一、小數轉換成單精度二進制

以32位單精度為例:

小數=-36.35

第一步:符號位,負用1表示,正的用0,所以[1個符號位] 是1

第二步:整數直接轉換成二進制

  十進制36 = 二進制0010 0100

第三步:將小數轉換成二進制

  十進制0.35 = 二進制0101 1001 1001 1001 10001 1001 其中1001循環

       計算過程:  0.35 x 2 = 0.7取整得取上次結果的小數部分乘以2

                          0.7 x 2 = 1.4取整得1  取0.7的小數部分即0.7乘以2

                          0.4 x 2 = 0.8取整得0  取1.4的小數部分即0.4乘以2

                          0.8 x 2 = 1.6取整得1  取1.6的小數部分0.6乘以2

                          0.6 x 2 = 1.2取整得1  取上次結果的小數部分乘以2

                          0.2 x 2 = 0.4取整得0

                          0.4 x 2 = 0.8取整得0

                                   ...循環

 第三步:移動小數點計算階碼

 整數二進制.小數二進制

 =0010 0100.0101 1001 1001 1001 10001 1001

 移動小數點,使二進制變成1.xxx*2n形式(規格化)

 =001.0 0100 0101 1001 1001 1001 10001 1001*25

   去掉1.xxx前面的0

   =1.0 0100 0101 1001 1001 1001 10001 1001*25

  指數的真值是5加上(8位階碼位移碼偏移量127)=132

  5 + 127 = 132

 132的二進制是1000 0100 所以[8個階碼位]是1000 0100

第四步:取1.xxx形式小數點后23位得到[23個尾數]=0 0100 0101 1001 1001 1001 10001 1001 .. (取23位)

第五步:組合二進制

  32位單精度二進制 = [1個符號位] [8個階碼位] [23個尾數位]

           = [1] [1000 0100] [0 0100 0101 1001 1001 1001 10001 1001 .. (取23位)]

           = 1 1000 0100 0 0100 0101 1001 1001 1001 10001 1001 .. (取23位)

  雙精度同理

 

二、二進制轉單精度小數

以0011 1001 0010 1011 1110 1000 000 0000為例

第一步:分三段

   0111 0010 010 1011 1110 1000 0000 0000

  [1個符號位] [8個階碼位] [23個尾數位]

       0表示正數

第二步:計算指數

  0111 0010階碼=十進制114,減去8位階碼位移碼偏移量127

  114 - 127 = -13

  在23位尾數前加1.變成 1.[23個尾數],然后向左移動13位(負數向左,正數向右)-- 和坐標軸方法一樣

       1.010 1011 1110 1000 0000 0000向左移動13位后等於0.0000 0000 0000 0 1010 1011 1110 1000 0000 0000

第三步:計算小數

  轉換成小數=2-14 + 2-16 + 2-18 + 2-20 + 2-21 + 2-22 + 2-23 + 2-24 + 2-26

                         =0.00008197128772735595703125

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM