有人可以向我解釋我如何將32位浮點值轉換爲16位浮點值?Float32到Float16
(S =符號E =指數且m =尾數)
如果32位浮點是1s7e24m
和16位浮點數是1s5e10m
然後是它那樣簡單做什麼?
int fltInt32;
short fltInt16;
memcpy(&fltInt32, &flt, sizeof(float));
fltInt16 = (fltInt32 & 0x00FFFFFF) >> 14;
fltInt16 |= ((fltInt32 & 0x7f000000) >> 26) << 10;
fltInt16 |= ((fltInt32 & 0x80000000) >> 16);
我假設它不是那麼簡單...所以任何人都可以告訴我你需要做什麼?
編輯:我相信我的指數轉移錯了......所以這會更好嗎?
fltInt16 = (fltInt32 & 0x007FFFFF) >> 13;
fltInt16 |= (fltInt32 & 0x7c000000) >> 13;
fltInt16 |= (fltInt32 & 0x80000000) >> 16;
我希望這是正確的。如果我錯過了一些已經說過的話,我很抱歉。它在星期五晚上幾乎是午夜...所以我不是「完全」清醒的;)
編輯2:Ooops。又犯了一個錯誤。我想失去前三位而不是更低!那麼這個怎麼樣:
fltInt16 = (fltInt32 & 0x007FFFFF) >> 13;
fltInt16 |= (fltInt32 & 0x0f800000) >> 13;
fltInt16 |= (fltInt32 & 0x80000000) >> 16;
最終代碼應該是:
fltInt16 = ((fltInt32 & 0x7fffffff) >> 13) - (0x38000000 >> 13);
fltInt16 |= ((fltInt32 & 0x80000000) >> 16);
我認爲這已經在這裏問(和回答):http://stackoverflow.com/questions/1659440/32-bit-to-16-bit-floating-point-conversion – humbagumba 2010-06-11 21:54:51
它可能是那麼簡單,但你會失去精度,除非float32沒有使用它所具有的所有「精度」......基本上,你可以獲得5/7的exp(你當然是最有意義的)和10/24的尾數;這些比率說不定,你可以在轉換中放鬆多少。就像它發生的情況一樣,如果你想將32位整數合併到一個16位整數中......可擴展數字的範圍更小; 「削減」尾數會降低「精度」,而指數也會限制範圍:5個有符號位給出-16到+15,反對-64/+ 63(如果我做對了......:D遲到了) – ShinTakezou 2010-06-11 21:58:25
@ShinTakezou:當然它不可能丟失16位數據而不會失去精度? Float16遠不夠精確,因此自動精度降低......或者我誤解了你? – Goz 2010-06-11 22:01:45