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

Floating point 压缩包含已解析十进制数的浮点,floating-point,compression,double,Floating Point,Compression,Double,我想压缩一个包含测量时间序列的大型双倍数组 我知道测量值在10进制,但我事先不知道精度 我可以利用这个事实来提高压缩比吗?在我的数据集上似乎没有特别好的效果。知道从给定精度的十进制表示中解析出的双精度确实提供了信息:对于精度3,它允许1.050000000000000444089209850066169452667236328125,最接近1.05,并且排除了许多邻近的双精度,它们不具有最接近任何具有3个有效数字的十进制表示的特性 对于通用压缩器来说,doubles这类序列的规律性似乎很难检测到

我想压缩一个包含测量时间序列的大型双倍数组

我知道测量值在10进制,但我事先不知道精度


我可以利用这个事实来提高压缩比吗?在我的数据集上似乎没有特别好的效果。

知道从给定精度的十进制表示中解析出的
双精度确实提供了信息:对于精度3,它允许
1.050000000000000444089209850066169452667236328125
,最接近
1.05
,并且排除了许多邻近的
双精度,它们不具有最接近任何具有3个有效数字的十进制表示的特性

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

使用传统的面向字符串的压缩算法,您可以通过将
double
s扩展为十进制表示,并在运行时使用有效位数来获得更好的压缩效果。因为您说
double
数字是从十进制表示中获得的,所以应该进行此转换除非有效小数位数超过15个左右,否则必须是无损的


这无疑是一个棘手的问题,理想的解决方案是,如果您可以使用一种专门的压缩算法,这种算法在不进行如此昂贵的预格式化的情况下是有效的。

对于每个数字,如果它为零,首先返回零。否则,取绝对值,除以10,直到该数字的对数基10。这将给你以十为底的尾数,一个[1,10]中的数字

现在将尾数转换为17位十进制数字。对于从1到17的
数字,取那么多的十进制数字并将其转换回双精度(小数点位于正确的位置).减去原始尾数。当返回绝对值小于2-47的值时,则停止。
位数
是十进制位数

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


我不知道这对你的数据有多大帮助。因为你提到这是一个测量的时间序列,你也可以通过减去第一个测量值后的连续值来预处理数据,如果信号相对连续且变化不太快,则差值中的数字可能会少。

什么是“FCP”?似乎没有任何明显的匹配@PascalCuoq的十几个扩展:抱歉。应该是FPC。我添加了一个链接。