了解 FE_TONEAREST 的作用

Understanding what FE_TONEAREST does

gcc 文档 here,解释了 FE_TONEAREST 的作用:

This is the default mode. It should be used unless there is a specific need for one of the others. In this mode results are rounded to the nearest representable value. If the result is midway between two representable values, the even representable is chosen. Even here means the lowest-order bit is zero.

现在,考虑下面的例子:

printf("%.2f\n", 1.235); // nearest are 1.23 and 1.24, 1.24 should be chosen
printf("%.2f\n", 1.225); // nearest are 1.22 and 1.23, 1.22 should be chosen

根据文档,我希望得到 1.241.22。相反,我得到 1.241.23.

我错过了什么?

如果您打印小数点后 17 位数字,您将得到:

1.23500000000000010
1.22500000000000009

因此两者都略高于“预期”的十进制表示形式,因此都四舍五入。

1.235 和 1.225 不是您程序中的数字。

您的 C 实现几乎肯定会为 double 使用 IEEE-754“双精度”格式,也称为 binary64。如果它正确地执行四舍五入转换为最接近的可表示值,则源文本 1.235 将转换为 [=100000000000000976996261670137755572795867919921875。当printf将其转换为小数点后两位小数时,没有平局;它高于 1.235,所以结果是数字“1.24”。

源文本 1.225 被转换为 double 1.225000000000000088817841970012523233890533447265625。当printf将其转换为小数点后两位小数时,没有平局;它高于 1.225,所以结果是数字“1.23”。