[英]compress floating point numbers with specified range and precision
在我的應用程序中,我將使用浮點值來存儲地理坐標(緯度和經度)。
我知道這些值的整數部分分別在[-90, 90]
和[-180, 180]
[-90, 90]
范圍內。 此外,我還要求對這些值強制執行一些固定的精度(現在它是0.00001
但可以在以后更改)。
在研究單精度浮點類型( float
)后,我可以看到包含我的值只是有點小。 這是因為180 * 10^5
大於2^24
(浮點數的大小),但小於2^25
。
所以我必須使用雙倍。 但問題是我要存儲大量的這些值,所以我不想浪費字節,存儲不必要的精度。
那么在將我的double值(具有固定的整數部分范圍和指定的精度X)轉換為java中的字節數組時,如何執行某種壓縮? 因此,例如,如果我使用我的示例中的精度( 0.00001
),我最終得到每個值5個字節。 我正在尋找一種輕量級的算法或解決方案,因此它並不意味着大量的計算。
要將數字x
存儲到固定精度(例如) 0.00001
,只需存儲最接近100000 * x
的整數。 (順便說一句,這需要26位,而不是25位,因為你也需要存儲負數。)
考慮到你的用例,我仍然會使用double並直接壓縮它們。
原因是強大的壓縮器,如7zip ,非常擅長處理“結構化”數據,這是一個雙數組(一個數據= 8個字節,這是非常規則和可預測的)。
您可能“手動”出現的任何其他優化可能都是劣等或提供可忽略的優勢,同時花費您的時間和風險。
請注意,您仍然可以應用在壓縮之前將double轉換為int的“技巧”,但我真的不確定它是否會帶給您實際的好處,而另一方面它會嚴重降低您應對意外范圍的能力未來的數字。
[ 編輯 ]根據源數據,如果“低於精度級別”位是“噪聲”,則通過舍入值或甚至直接在最低位上應用掩碼,可以用於壓縮比來消除噪聲位(i猜測這最后一種方法不會讓純粹主義者滿意,但至少你可以用這種方式直接選擇你的精確度,同時保持可用的全部可能值。)
所以,總結一下,我建議你的雙數組上直接LZMA壓縮 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.