考虑到你的用例,我仍然会使用 的 双 强> 并直接压缩它们。
原因是强大的压缩机,如 7zip的 ,非常善于处理“结构化”数据,其中一个double数组(一个数据= 8个字节,这是非常规则和可预测的)。
您可能“手动”出现的任何其他优化可能都是劣等或提供可忽略的优势,同时花费您的时间和风险。
请注意,您仍然可以应用在压缩之前将double转换为int的“技巧”,但我真的不确定它是否会带给您实际的好处,而另一方面它会严重降低您应对意外范围的能力未来的数字。
[ 编辑 ]根据源数据,如果“低于精度级别”位是“噪声”,则通过舍入值或者甚至直接在最低位上应用掩码,压缩比可以用于消除噪声位(我猜这个最后一种方法不会让纯粹主义者满意,但至少你可以通过这种方式直接选择你的精确度,同时保持可用的全部可能值。
所以,总结一下,我建议 直接LZMA压缩 在你的数组上。
存储号码 x 到(例如)固定精度 0.00001 ,只需存储最接近的整数 100000 * x 。 (顺便说一句,这需要26位,而不是25位,因为你也需要存储负数。)
x
0.00001
100000 * x
如 TonyK 说 他的回答 ,用一个 int 存储数字。
int
要进一步压缩数字,请使用局部性:地理坐标通常“聚集”(比如城市街区的轮廓)。使用固定参考点(完整的2x26位分辨率),然后将偏移存储到最后一个坐标为 byte s(给你+/- 0.00127)。或者,使用 short 这给你超过一半的价值范围。
byte
short
只需确保在仅提供的类中隐藏压缩/解压缩 double 作为外部API,您可以随时调整精度和压缩算法。
double