我们如何需要17位有效的十进制数字来识别任意双精度浮点数?



参考链接:https://www.exploringbinary.com/the-shortest-decimal-string-that-round-trips-examples/。它说,计算机科学中一个众所周知的结果是,您需要17位有效的十进制数字来识别任意双精度浮点数。此外,它还使用了下面的示例

The floating point number 50388143.0682372152805328369140625 cannot be rounded to anything less than 17 digits and still round-trip. Rounded to 17 digits it’s 50388143.068237215, which converts back to our floating-point number. Rounded to 16 digits it’s 50388143.06823722, which is closer to the next floating-point number

这个链接让我越来越困惑。假设我的号码是50388143.0682372156805328369140625如果四舍五入到17位,就得到50388143.068237216。怎么和原来的数字一样?我不认为它是来回的。实际上它和原来的数不同。我错过了什么?

这个链接让我越来越困惑。假设我的数字是50388143.0682372156805328369140625,如果我四舍五入到17位,那么它就是50388143.068237216。怎么和原来的数字一样?

我错过了什么?

我的号码(作为double)是50388143.068237215_6805328369140625;从一个错误的前提开始

double可以编码多个值,但不能编码50388143.068237215_6805328369140625。相反,代码将使用附近的值:50388143.068237215_2805328369140625。

将其舍入为17显著替换为文本变成"50388143.068237215"。

将该文本转换回double再次生成double,其值为50388143.068237215_2805328369140625。


一般来说,如果double—>text(使用少于17位有效十进制数字)——>

如果尝试double,可能会导致相同的double

失败。17有效的十进制数字足以满足所有double

为什么17与典型的双编码53位有效二进制数字(~9*1015组合)有关,并且与二进制double相比,十进制文本值的精度不稳定。

相关内容

  • 没有找到相关文章

最新更新