最近突然糾結與浮點型到底是怎麼儲存的,看了很多理論描述,以為沒有找到特別詳細的例子,還是一臉懵逼。所以我特意記錄一下浮點型變數儲存方式的例子。
以最常用的ieee-754標準為例,單精度浮點型的二進位制主要分為三部分:數符、階數、尾數(階數也包含一位階符,但從儲存上看應該是三部分)。
公式為:數符x尾數x2^階碼 (1)
數符決定正負,尾數決定精度,階碼決定大小。比如:
-1.0111x2^-1001 (前面的-是數符,1.0111是儲存的尾數,-1001是階數,其實階碼就是十進位制-9)
在ieee-754標準中,單精度浮點型(float型)是4位元組,32位,其中一位階數,8位階碼和23位尾數。如圖:
(**於網路)
下面通過乙個例子來了解浮點型怎麼儲存的。
求記憶體中浮點型11000000100010000000000000000000對應的十進位制原型
分割:1(儲存的數符)10000001(儲存的階碼)00010000000000000000000(儲存的尾數)
符號:-(0為正,1為-負)
求尾數:1.0001(尾數求值方式為整數部分為1,小數部分為記憶體中儲存的尾數0001,省略了後面的19個0)
求 階碼原碼:(記憶體中儲存的二進位制為階碼的移碼再減去1,移碼等於補碼的符號位取反,換算成十進位制計算就是階碼加上127等到儲存階碼,這就是很多書上說的位移127,所以逆運算可以求得階碼)
10000001(儲存的階碼)
10000010(加一得移碼)
00000010(符號位取反得補碼)
00000010(根據補碼求得原碼)
所以求得階碼原碼是00000010。
也可以用十進位制方式求:
(二進位制)10000001=(十進位制)129
129 - 127 = 2 = (二進位制)00000010(階碼得原碼)
根據公式(1)得:
-1.0001 x 2^2 = -100.01 (階碼為2,所以小數點右移2位)
整數部分為-100,化為十進位制等於-4;小數部分為0.01化為十進位制等於(0 x 2-1) + (1 x 2-2) = 0.25
所以最終十進位制為:-4.25
反過來求浮點型-4.25的二進位制儲存
分割:-(數符)
4(整數部分)= (二進位制)100
0.25(小數部分)= (二進位制)0.01
小數部分如果資料較大使用乘2取整數法求對應的二進位制。例如:0.3456
0.3456 x 2 = 0.6912 取整數部分為0
0.6912 x 2 =1.3824 取整數部分為1
0.3824 x 2 = 0.7648 取整數部分為0
0.7648 x 2 = 1.5296 取整數部分為1
0.5296 x 2 = 1.0392 取整數部分為1
…得到的二進位制就是0.01011…
將整數部分與小數部分相加得到:-100.01
規範化(ieee-754要求規範化):-1.0001 x 2^2
儲存數符位:1
儲存的尾數字:00010000000000000000000(1.0001取小數部分然後補零夠23位)
儲存的階碼求值方式:
00000010(原碼,正2的二進位制)
00000010 (補碼)
10000010 (移碼)
10000001 (儲存的階碼,移碼減一)
十進位制計算方法:
2 + 127 = 129 = (二進位制)10000001
所以最終-4.25在記憶體中的儲存二進位制為:
110000001 00010000000000000000000
單精度浮點數(IEEE754)
單精度浮點數佔據4個位元組,4個位元組的分配如下 a 第一位為符號位,0表示正,1表示負 b 第2 9位為階碼,採用移碼表示 c 第10 32位為尾數,採用原碼表示。1 給定32位串,如何轉換成十進位制數 假設記憶體中存在32位串 cd cc 08 41。因為intel cpu採用little en...
閱讀IEEE754關於浮點運算筆記
最近重新看了一篇 深入理解計算機系統 果然好書讀多少次都能得到新的知識。關於浮點運算ieee754上次讀過還只是蜻蜓點水,完全沒有深入理解,這次結合p.j.plauger寫的 c標準庫 對該標準在計算機中是如何實現的有了更深入的了解。下面我記錄下我最近閱讀內容及個人的思考理解。符號 s 1這個數為負...
IEEE754浮點數精度轉換
最近在利用串列埠讀取溫度採集模組上面的資料時發現返回過來的資料是16進製制的ieee754型別,很顯然這不是我們想要看到的,因此我們必須對他進行解析 因為我用的是j a,所以首先翻了相關文件,發現還真提供的有 float.intbitstofloat hex 當然自己也可以手寫乙個,這時我們就需要了...