对于大多数数字,我们知道任何浮点值都会有一些精度误差。对于32位浮点数,计算出大约6个有效位数,这些数字在你开始看到不正确的值之前是准确的。
我正在尝试存储一个人类可读的值,这个值可以被读取并重新创建一个对序列化值的稍微准确的重新创建。
例如,值555.5555
存储为555.55548095703125
;但是当我序列化555.55548095703125
时,理论上可以将其序列化为范围(555.5554504395, 555.555511475)
(排他的)中的任何东西,并且仍然得到相同的字节模式。(实际上,这可能不是确切的范围,我只是不知道现在更准确地计算它是否有价值。)
我想要的是为这个值找到最可读的字符串表示--我想这是最少的数字--它将被反序列化为相同的IEEE浮点数。
发布于 2019-07-16 05:32:17
这个问题最初是在1990年用一种叫做“龙”的算法解决的:https://dl.acm.org/citation.cfm?id=93559。
去年有一种更现代的技术,叫做“龙”(日语中“龙”的日文):https://dl.acm.org/citation.cfm?id=3192369。
库的GitHub在这里:https://github.com/ulfjack/ryu
根据他们的自述:
Ryu生成一个保持往返安全的浮点数的最短十进制表示。也就是说,正确的解析器可以恢复准确的原始数字。例如,考虑二进制64位浮点数00111110100110011001100110011010.存储值精确为0.300000011920928955078125。然而,这个浮点数也是最接近十进制数0.3的数字,所以这就是Ryu输出的内容。
https://stackoverflow.com/questions/57050586
复制相似问题