根據IEEE的標準,浮點數的定義如下
|
符號位 |
指數位 |
小數部分 |
指數偏移量 |
單精度浮點數 |
1 位[31] |
8位 [30-23] |
23位 [22-00] |
127 |
雙精度浮點數 |
1 位[63] |
11 位[62-52] |
52 位[51-00] |
1023 |
我們以單精度浮點數來說明:
符號位,表述浮點數的正或者負
指數實際也有正負的,但是沒有單獨的符號位,而是采用了一個偏移來表示
在計算機的世界里,進位都是二進制的,指數表示的也是2的N次冪
這個數據格式當中的,指數是8位,可表達的范圍是0到255
而對應的實際的指數是-127到+128
這里特殊說明,-127和+128這兩個數據在IEEE當中是保留的用作多種用途的
-127表示的數字是0
128和其他位數組合表示多種意義,最典型的就是NAN狀態
小數部分,并不是一個浮點數的實際的小數
實際的小數在這個小數前面還保留了一個1
拿浮點數1.0來說
符號位是0, 實際指數是0,對應這里的指數就是127了,也就是0x7f
而小數部分就是1.0了, 1是暗含的不存儲,實際的小數部分就是0了
因此組合起來的數據就是,0x3f80000
可以用一個類來表示:
class FloatType
{
public:
union {
DWORD m_dwInt;
float m_fFloat;
struct {
int m_nFra: 23;
int m_nExp : 8;
bool m_bSign : 1;
};
};
-----------------------------
參考IEEE的浮點數格式說明
對于0到1范圍內的浮點數是可以壓縮的
顯然在0到1的范圍內,一個單精度的浮點數,指數和符號位占據9個bit
而這9個bit是可以不用的,把它去除,只保留小數部分的23bit就可以達到壓縮的目的
可以把一個浮點數從32bit,4字節壓縮到23bit,3字節的范圍內
這也是在3dmax等一些工具軟件當中對浮點數進行壓縮存儲的方法。
比如,在單位化的法向量當中,每個浮點數都是0,1范圍之間的數據
正常情況下表示三維空間當中的單位化法向量就需要12個字節
而經過這個壓縮處理,只需要9個字節
-----------------------------