serialization - 如何找到最简单的人类可读的浮点字符串,该字符串在转换回浮点时会产生相同的字节?

标签 serialization floating-point precision human-readable

对于大多数数字,我们知道任何浮点值都会存在一些精度误差。对于 32 位 float ,计算出大约 6 位有效数字,在您开始看到不正确的值之前,这将是准确的。

我正在尝试存储一个人类可读的值,该值可以读入并重新创建序列化值的位精确重建。

例如,值555.5555存储为555.55548095703125;但是当我序列化 555.55548095703125 时,理论上我可以将其序列化为 (555.5554504395, 555.555511475) (独占)范围内的任何内容,并且仍然获得相同的字节模式。 (实际上,这可能不是确切的范围,我只是不知道目前更准确地计算它是否有值(value)。)

我想要的是找到该值最易读的字符串表示形式——我想这将是最少的数字——它将被反序列化为相同的 IEEE float 。

最佳答案

这正是 1990 年最初通过创建者称为“Dragon”的算法解决的问题: https://dl.acm.org/citation.cfm?id=93559

去年有一种更现代的技术,速度明显更快,称为“Ryu”(日语“龙”):https://dl.acm.org/citation.cfm?id=3192369

该库的 GitHub 位于:https://github.com/ulfjack/ryu

根据他们的自述:

Ryu generates the shortest decimal representation of a floating point number that maintains round-trip safety. That is, a correct parser can recover the exact original number. For example, consider the binary 64-bit floating point number 00111110100110011001100110011010. The stored value is exactly 0.300000011920928955078125. However, this floating point number is also the closest number to the decimal number 0.3, so that is what Ryu outputs.

关于serialization - 如何找到最简单的人类可读的浮点字符串,该字符串在转换回浮点时会产生相同的字节?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57050586/

相关文章:

java - Android序列化-java反序列化

c# - 如何将 Json 嵌套属性获取到主要属性

ios - 浮点值用双引号从 [String : AnyObject] in swift

math - float 学有问题吗?

python - 为什么 QDoubleSpinBox 的精度有时高于其小数属性允许的精度?

serialization - flutter 序列化儿子列出对象抛出异常

java - 是否可以将未知格式文件合并到 jar 文件

c++ - 为什么 printf 和 isnan 不同意 long double 值是否为 NaN?

excel - 将数字从 Excel 单元格转换为 IEEE 754 Hex 格式

python - 由于比例因子和偏移量,导入 Python 时 NetCDF 数据精度下降