浮點型數據(float, double)存儲IEEE標準解析和應用

原文地址:https://www.cnblogs.com/zhugehq/p/5918599.html

原文使用了C語言演示IEEE標準,但該標準適用於MySQL。

在C語言中,浮點型變量(也就是帶小數位的實數)在內存中的存儲方式遵循IEEE標準。

首先來看單精度浮點型float。float佔用4字節空間,也就是32位。從左向右數,第1位是符號位(0代表正數,1代表負數),接着是8位指數位,剩下的23位是數據位。如下所示

S EEEEEEEE DDDDDDDDDDDDDDDDDDDDDDD

由於採用了科學計數法,所有的23位D位(數據位)全部用來記錄小數點右邊的數據,因爲小數點左邊只有1位且它肯定是1(二進制)。

以3.5爲例,它的二進制形式是 11.1,轉換爲科學計數法是 1.11E1。可以知道 S位(符號位 )應填入正(0),E位(指數位)爲應填入1,D位(數據位)應填入11。

PS:選擇3.5的原因是它可以正好被精確地轉換成二進制數。大多數的小數是不能被精確地轉換的,這涉及到十進制小數轉換二進制的精度問題。如3.6會是11.100110011001100(1100…)這種無限循環, 轉換成IEEE標準的小尾則是 66 66 66 40。爲了方便和精確,本文選擇了3.5和-10.625這兩個可以被精確轉換的數。

需要注意的是,E位的編碼形式並非常用的補碼形式(正數是它本身,負數符號位變1數據取反加一),而是把E位的8位能代表的數據空間(0-255)左右分爲兩半,以127爲中點,代表0。如果指數爲是1,則E位是128;如果指數位是2,則E位是129;如果指數位是-1,則E位是126,以此類推。

回到3.5的例子,我們可以得到E位實際上應該是128,也就是10000000。D位從左向右開始填,沒有的則爲0。 所以,3.5的浮點表達爲

0 10000000 11000000000000000000000

整理爲4位一組,則是

0100 0000 0110 0000 0000 0000 0000 0000

4    0     6    0    0    0    0    0

可以推測,以小尾方式存儲在內存中的3.5,它的形式應該是 0000 6040。用如下的示例程序結合WinHex來驗證。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章