3

我正在沉浮(大)浮點數組,每個浮點數需要4個字節。有效的方法來存儲一個固定範圍的浮點數

有沒有一種方法,鑑於我的花車0和255之間不等,在每個浮點存儲大於4個字節少?

我可以在整個數組上做任何數量的計算。

我正在使用C.

回答

1

的絕對範圍內的數據並沒有真正管那麼多了,它的精度您需要的量。如果你可以逃避例如6位數的精度,那麼你只需要存儲從1-1000000存儲整數所需的存儲量,這就是20位。所以,假設這一點,你可以做的是:

1)移動你的數據,使最小的元素的值爲0。從每個元素中減去一個值。記錄這個轉變。

2)將數據縮放(乘以)一個足夠大的數字,以便在截斷爲整數後,不會失去所需的精度。

3)現在,這可能會很棘手,除非你可以將數據打包成方便的8位或16位單元 - 將數據打包成連續的無符號整數。在本例中,每個數據值都需要20位,所以值1佔據整數1的前20位,值2佔用整數1的剩餘12位和整數2的前8位,依此類推。在這個假設的情況下,你最終節省了40%。

4)現在,'解密'。解壓縮這些值(您已經保存了每一箇中的位數),不進行縮放和不移位。

因此,這將做到這一點,並且可能比標準壓縮算法更快更緊湊,因爲它們不允許對您需要多少精度做出假設,但您是這樣做的。

+0

謝謝。看起來主要想法是先確定精度。 – cojocar 2012-02-14 09:40:27

+1

是的,這是我想的開始和結束。之後,請確保您使用* unsigned *整數進行的任何「位封裝」,否則符號位可能會使事情不必要地複雜化。此外,由於你的絕對範圍是有限的,[浮點數只能在尾數中使用23位](http://en.wikipedia.org/wiki/File:IEEE_754_Single_Floating_Point_Format.svg)我認爲你至少可以保證* some *節省通過這種技術造成的任何精度損失。 – 2012-02-14 09:48:17

1

您需要多少精度?

當需要實際值時,可以通過將每個浮點數表示爲unsigned short(範圍從0到65,535)並將所有值除以2^8來將每個浮點數存儲在2個字節中。這與使用固定點格式而不是浮點格式基本相同。

但是,當您這樣做時,您的精度限制爲1.0/(2^8) = 0.00390625

+0

我不知道確切的精確度;我會嘗試這種方式,看看它是否有效。無論如何,感謝這個想法 - 如果我想要更高的精度,我可以使用3個字節,但是我會遇到一些對齊問題。也許有沒有精度損失的解決方案。 – cojocar 2012-02-14 09:35:13

+1

作爲一個旁註,這是完美的統一分配。如果值趨向於大約爲0,那麼在需要更高精度的情況下,可以使用[半精度](http://en.wikipedia.org/wiki/Half-precision_floating-point_format)或使用3位自定義浮點指數。 – Lyth 2012-02-14 09:39:07

0

例如,您可以在一個字節上存儲整數(浮點數爲.0),但另一個浮點數需要更多字節。

你也可以使用固定點,如果你不擔心精度...

相關問題