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