压缩包含已解析的十进制数的浮点数

时间:2014-03-31 10:42:53

标签: floating-point compression double

我想压缩包含时间序列测量值的大量双打。

我知道测量结果是基数为10,但我不知道提前的精确度。

我可以使用这个事实来提高压缩比吗? FPC似乎在我的数据集上效果不佳。

2 个答案:

答案 0 :(得分:2)

知道从具有给定精度的十进制表示中解析double确实提供了信息:对于精度3,它允许1.0500000000000000444089209850062616169452667236328125double最接近1.05 ,并且排除了附近的许多doubles,它们没有最接近任何带有3位有效数字的十进制表示的属性。

这种double s序列的规律性对于通用压缩器来说似乎很难检测:只能通过查看连续的64位数据片段来注意它。即便如此,也不会重复任何价值。相反,要注意的事实是所有存在的double在形状[10 n ... 10 n + 1 )的间隔上均匀分布。智能通用压缩器需要注意这一点并利用它。

通过将double扩展为十进制表示形式,您可以使用传统的面向字符串的压缩算法获得更好的压缩效果,并在运行时使用有效位数。由于您说double数字是从十进制表示中获得的,因此除非有效十进制数字的数量大于15,否则此转换应该是无损的。

这无疑是尴尬的,理想的解决方案是如果你可以使用专门的压缩算法,这种算法在没有这种昂贵的预格式化的情况下是有效的。

答案 1 :(得分:1)

对于每个数字,如果它为零,则首先返回零。否则取绝对值并除以10提升到对数基数十的数字。这将给你十分基数的尾数,[1,10)中的数字。

现在将尾数转换为17位十进制数字。对于从1到17的digits,取这许多小数位并将它们转换回双精度(在正确的位置有一个小数点)。减去原始尾数。当返回绝对值小于2 -47 的东西时,则停止。 digits是十进制数字。

现在,您可以将十进制尾数和指数编码为整数,希望比原始双精度更少。您可以使用几位提供整数中的位数。

我不知道这对您的数据有多大帮助。由于您提到这是一个时间序列的测量,您还可以通过在第一个值之后减去连续值来预处理数据,如果信号相对连续且变化不太快,则可能在差异中具有较少的位数。 / p>