C++四舍五入到FE_TONERAEST

C++ rounding to FE_TONEAREST

本文关键字:TONERAEST FE 四舍五入 C++      更新时间:2023-10-16

有人能解释一下为什么0.5FE_TONEAREST四舍五入会得到0吗?结果不应该是"1"吗?有办法"解决"这个问题吗?

#include <fenv.h>
#include <iostream>
#include <cmath>
int main() {
    fesetround(FE_TONEAREST);
    std::cout << "Rounding 0.5 to nearest = " << std::rint(0.5) << std::endl;
    return 0;
}

coliru上的可运行代码:http://coliru.stacked-crooked.com/a/9c179ca56f251628

FE_TONEAREST导致std::rint将中间事例(±n.5)四舍五入到最接近的偶数整数值。CCD_ 7是偶数。

如果您将std::round与此模式一起使用,则一半的情况将"向上"取整(远离零),这将导致1

参见std::rint的文档。

为什么你可能想要这种不寻常的舍入形式,Mathematica.SE上已经解释过了。(这样你的数据就不会全部向一个方向移动)。

顺便说一句,C++提供了标准头的正确包装版本,并将名称添加到std命名空间中(尽管这在这里并不重要):这通常是#include <cfenv>而不是#include <fenv.h>