c语言 - 什么应该打印f("%.15e",1e23);打印?



我正在尝试优化双->文本转换(试图击败grissu, ryu等…)。

在这样做时,我将我的结果与sprintf输出进行比较。现在我遇到了上述有趣的案例。

printf("%.15e", 1e23);

(如。glibc)打印

9.999999999999999 e + 22

而我的例程打印

1.000000000000000 e + 23

现在这两个数字与"真值"的距离相同。并将这两个值转换回来(例如使用atof)会产生相同的双精度。

然而,我相信我的结果满足"四舍五入"。规则(这是它这样做的原因)。

哪个结果更正确?

1e23通常不准确地表示为double

最接近的两个选择是:

// %a           v     %f 
0x1.52d02c7e14af6p+76  99999999999999991611392.000000
0x1.52d02c7e14af7p+76 100000000000000008388608.000000

从1000000000000000000000000000.0有两个8388608.0,一个上一个下

通常在这种情况下选择的是偶数。(见十六进制格式的最后一位)

99999999999999991611392.000000是赢家,因此"9.999999999999999e+22"的输出是预期的。

当打印更多的DBL_DIG(15)位有效数字时,("%.15e"打印16位有效数字)这个问题是可能的,因为代码有效地进行了文本-double-文本的往返,并且超过了double的往返。


我正在试验优化双->文本转换

我也建议使用"%a"来获得更深入的理解。

最新更新