了解 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.24
和 1.22
。相反,我得到 1.24
和 1.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”。
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.24
和 1.22
。相反,我得到 1.24
和 1.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”。