答案 0 :(得分:2)
知道从具有给定精度的十进制表示中解析double
确实提供了信息:对于精度3,它允许1.0500000000000000444089209850062616169452667236328125
,double
最接近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>