C++ 四舍五入到 FE_TONEAREST
C++ rounding to FE_TONEAREST
任何人都可以解释为什么将 0.5
舍入到 FE_TONEAREST
得到 0
?结果不应该给'1吗?有办法"fix"吗?
#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
) 舍入到最接近的 even 整数值。 0
是偶数。
如果您在此模式下改用 std::round
,中途情况会 "up"(远离零),这将导致 1
.
参见 documentation for std::rint
。
为什么 您可能希望这种不寻常的舍入形式是 explained over on Mathematica.SE。 (因此您的数据不会全部朝一个方向移动)。
顺便说一句,C++ 提供了标准头文件的正确包装版本,名称添加到 std
命名空间(尽管这在这里无关紧要):通常 #include <cfenv>
而不是 #include <fenv.h>
.
任何人都可以解释为什么将 0.5
舍入到 FE_TONEAREST
得到 0
?结果不应该给'1吗?有办法"fix"吗?
#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
) 舍入到最接近的 even 整数值。 0
是偶数。
如果您在此模式下改用 std::round
,中途情况会 "up"(远离零),这将导致 1
.
参见 documentation for std::rint
。
为什么 您可能希望这种不寻常的舍入形式是 explained over on Mathematica.SE。 (因此您的数据不会全部朝一个方向移动)。
顺便说一句,C++ 提供了标准头文件的正确包装版本,名称添加到 std
命名空间(尽管这在这里无关紧要):通常 #include <cfenv>
而不是 #include <fenv.h>
.