Может кто-нибудь, пожалуйста, объясните, почему округления 0.5
в FE_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;
}
Запускаемый код на колиру: http://coliru.stacked-crooked.com/a/9c179ca56f251628
FE_TONEAREST
причины std::rint
округлить полпути (±n.5
) до ближайшего четное целочисленное значение. 0
даже.
Если бы вы вместо этого использовали std::round
в этом режиме полпути округляются «вверх» (от нуля), и это приведет к 1
,
Увидеть документация для std::rint
.
Зачем Вы могли бы хотеть эту необычную форму округления объяснил на Mathematica.SE. (поэтому ваши данные не все сдвинуты в одном направлении).
Кроме того, C ++ предоставляет правильно упакованную версию стандартных заголовков с именами, добавленными к std
пространство имен (хотя это вряд ли имеет значение здесь): это обычно #include <cfenv>
скорее, чем #include <fenv.h>
,
Других решений пока нет …