簡體   English   中英

壓縮具有指定范圍和精度的浮點數

[英]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位,因為你也需要存儲負數。)

正如TonyK他的回答中所說,使用int來存儲數字。

要進一步壓縮數字,請使用局部性:地理坐標通常“聚集”(比如城市街區的輪廓)。 使用固定參考點(完整的2x26位分辨率),然后將偏移量存儲到最后一個坐標作為byte s(給出+/- 0.00127)。 或者,使用short可以獲得超過一半的值范圍。

只需確保在一個只提供double外部API的類中隱藏壓縮/解壓縮,因此您可以隨時調整精度和壓縮算法。

考慮到你的用例,我仍然會使用double並直接壓縮它們。

原因是強大的壓縮器,如7zip ,非常擅長處理“結構化”數據,這是一個雙數組(一個數據= 8個字節,這是非常規則和可預測的)。

您可能“手動”出現的任何其他優化可能都是劣等或提供可忽略的優勢,同時花費您的時間和風險。

請注意,您仍然可以應用在壓縮之前將double轉換為int的“技巧”,但我真的不確定它是否會帶給您實際的好處,而另一方面它會嚴重降低您應對意外范圍的能力未來的數字。

[ 編輯 ]根據源數據,如果“低於精度級別”位是“噪聲”,則通過舍入值或甚至直接在最低位上應用掩碼,可以用於壓縮比來消除噪聲位(i猜測這最后一種方法不會讓純粹主義者滿意,但至少你可以用這種方式直接選擇你的精確度,同時保持可用的全部可能值。)

所以,總結一下,我建議你的雙數組上直接LZMA壓縮

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM