我正在沉浮(大)浮點數組,每個浮點數需要4個字節。有效的方法來存儲一個固定範圍的浮點數
有沒有一種方法,鑑於我的花車0和255之間不等,在每個浮點存儲大於4個字節少?
我可以在整個數組上做任何數量的計算。
我正在使用C.
我正在沉浮(大)浮點數組,每個浮點數需要4個字節。有效的方法來存儲一個固定範圍的浮點數
有沒有一種方法,鑑於我的花車0和255之間不等,在每個浮點存儲大於4個字節少?
我可以在整個數組上做任何數量的計算。
我正在使用C.
的絕對範圍內的數據並沒有真正管那麼多了,它的精度您需要的量。如果你可以逃避例如6位數的精度,那麼你只需要存儲從1-1000000存儲整數所需的存儲量,這就是20位。所以,假設這一點,你可以做的是:
1)移動你的數據,使最小的元素的值爲0。從每個元素中減去一個值。記錄這個轉變。
2)將數據縮放(乘以)一個足夠大的數字,以便在截斷爲整數後,不會失去所需的精度。
3)現在,這可能會很棘手,除非你可以將數據打包成方便的8位或16位單元 - 將數據打包成連續的無符號整數。在本例中,每個數據值都需要20位,所以值1佔據整數1的前20位,值2佔用整數1的剩餘12位和整數2的前8位,依此類推。在這個假設的情況下,你最終節省了40%。
4)現在,'解密'。解壓縮這些值(您已經保存了每一箇中的位數),不進行縮放和不移位。
因此,這將做到這一點,並且可能比標準壓縮算法更快更緊湊,因爲它們不允許對您需要多少精度做出假設,但您是這樣做的。
您需要多少精度?
當需要實際值時,可以通過將每個浮點數表示爲unsigned short
(範圍從0到65,535)並將所有值除以2^8
來將每個浮點數存儲在2個字節中。這與使用固定點格式而不是浮點格式基本相同。
但是,當您這樣做時,您的精度限制爲1.0/(2^8) = 0.00390625
。
例如,您可以在一個字節上存儲整數(浮點數爲.0),但另一個浮點數需要更多字節。
你也可以使用固定點,如果你不擔心精度...
謝謝。看起來主要想法是先確定精度。 – cojocar 2012-02-14 09:40:27
是的,這是我想的開始和結束。之後,請確保您使用* unsigned *整數進行的任何「位封裝」,否則符號位可能會使事情不必要地複雜化。此外,由於你的絕對範圍是有限的,[浮點數只能在尾數中使用23位](http://en.wikipedia.org/wiki/File:IEEE_754_Single_Floating_Point_Format.svg)我認爲你至少可以保證* some *節省通過這種技術造成的任何精度損失。 – 2012-02-14 09:48:17