我正在尝试优化双文本转换(试图打败grissu、ryu等人)。
在此过程中,我正在将我的结果与sprintf
输出进行比较。现在我遇到了上面这个有趣的情况。
printf("%.15e", 1e23);
例如glibc)打印
我的程序打印
这两个数字与“真实值”的距离相同,将这两个值都转换回来(例如使用`atof`)会产生相同的双精度浮点数。
然而,我认为我的结果满足“银行家舍入规则”(这也是导致结果如此的原因)。
哪个结果更正确?
我正在尝试优化双文本转换(试图打败grissu、ryu等人)。
在此过程中,我正在将我的结果与sprintf
输出进行比较。现在我遇到了上面这个有趣的情况。
printf("%.15e", 1e23);
1e23
通常不能被准确表示为double
。
最接近的两个选择是:
// %a v %f
0x1.52d02c7e14af6p+76 99999999999999991611392.000000
0x1.52d02c7e14af7p+76 100000000000000008388608.000000
有两个数字:8388608.0 和 100000000000000000000000.0,一个在上面,一个在下面。
通常,在并列情况下选择偶数。(参见十六进制格式中的最后一位。)
99999999999999991611392.000000是获胜者,因此预计输出为"9.999999999999999e+22"
。
当使用更多的DBL_DIG
(15)有效数字进行打印时,("%.15e"
打印16个有效数字),这个问题是可能的,因为代码实际上正在执行文本-double
-文本往返,并超过了double
可以往返的范围。
printf
。 - Antti Haapala -- Слава Україні.30e
精度打印显示为9.999999999999999161139200000000e+22
。 - Adrian Mole