float在捨棄一些精度和範圍的情況下,可以做些壓縮,節省存儲空間。本文介紹3種壓縮方式:fp16,Int8,fp block
float存儲格式
V = (-1) ^ s × M × 2 ^ E
(1)(-1)^s 表示符號位,當 s=0,V 爲正數;當 s=1,V 爲負數。
(2)M 表示有效數字,大於等於 1,小於 2,但整數部分的 1 不變,因此可以省略。
(3)2^E 表示指數位。
比如: 對於十進制的 5.25 對應的二進制爲:101.01,相當於:1.0101*2^2。所以,S 爲 0,M 爲 1.0101,E 爲 2。
對於float 32位存儲,M爲23Bit,E爲8bit,s 1bit,具體存儲格式,見下圖:
則,我們可以計算出,float的值範圍爲:[-3.4*10^38,-1.18*10^-38]U[1.18*10^-38,3.4*10^38]
fp16壓縮:
半精度浮點數 是一種被計算機使用的二進制浮點數據類型。半精度浮點數使用2個字節(16位)來存儲。
在IEEE 754-2008中,它被稱作binary16。這種數據類型只適合存儲對精度要求不高的數字,不適合用來計算。
IEEE 754 標準指定了一個 binary16 要有如下的格式:
- Sign bit(符號位): 1 bit
- Exponent width(指數位寬): 5 bits
- Significand precision(尾數精度): 11 bits (有10位被顯式存儲)
按如下順序排列:
最大值爲:0 11110 1111111111=(-1)^0 * 2^15 * (1+1-2^-10)=65504
正數最小值爲:0 00001 0000000000=2^-14=6.10 * 10^-5
int8壓縮:
根據float的range,將int8 128bit,平均分,存儲float的值,精度損失與float的range範圍相關。
block fp壓縮:
針對多float的存儲做壓縮,統計系列數的最大指數(Exponent),並統一存儲一個指數,統計其他的小數位(Fraction),此壓縮適合於系列float值相差較少的。