如何找到最简单的人类可读的 float 字符串,当转换回 float 时会产生相同的字节?

How to find the simplest human-readable float string which would yield the same bytes when converted back to float?

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

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

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

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

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

去年有一种更现代的技术,称为 "Ryu"("dragon" 的日语):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.