【发布时间】:2016-09-07 12:53:02
【问题描述】:
假设我有一个浮点值数组,它目前是我在磁盘加载和包大小限制方面的瓶颈。给定以下 3 个输入,我如何对这些值进行编码以减少数据大小:
- 绝对误差:我可以删除任何尾数位,只要最终值与实际值相差这个数量(这是设计使然,它是基于屏幕错误的数据可视化)李>
- 最小浮点值:数组中的最小值
- 最大浮点值:数组中的最大值
注意:如果float值太小,它只会被转换为0(因为使用绝对误差,整个尾数被删除,对于太大的数字,尾数就被留下原封不动)。
浮点值出现的顺序很重要(它不仅仅是点云)。所以无论是哪种编码,解码后的顺序都应该保留。
现在我无法成功保存尽可能多的位:
我可以使用 Min/Max 值在指数字段中保存 3 到 5 位,但我无法利用绝对误差,也无法利用 Min/Max 值中的额外位。 如果 Max 值不太大,我也可以从 1 到 3 个尾数位减少,但在这里我再次没有最佳地使用 3 个输入。
我不是在寻找压缩,只是为了更好的编码(包已经是 7 压缩包)。另请注意,我指的是常规 float 和 double 值,您可以在 C# 和 C++ 中找到。
重要通知: 当 IEEE 浮点数中的指数足够大时,绝对误差会变得大于我用作输入的值(项目符号列表中的第一个点)。这不是问题,因为无论如何数据以浮点开始和结束。相反,重要的是在尾数中丢弃无用的位。
我已经尝试过定点数,它们可以工作,但只能达到一定程度。(请参阅对 tera 答案的评论)。
【问题讨论】:
-
为什么不考虑为手头的数据量身定制的自定义压缩,或者可能结合与 ZIP 等通用压缩。也许看看:Martin Burtscher 和 Paruj Ratanaworabhan,“FPC:双精度浮点数据的高速压缩器”,*IEEE Trans.比较,卷。 58,第 1 期,2009 年 1 月,第 18-31 页。