c ++ 11 — округление C ++ до FE_TONEAREST

Может кто-нибудь, пожалуйста, объясните, почему округления 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

3

Решение

FE_TONEAREST причины std::rint округлить полпути (±n.5) до ближайшего четное целочисленное значение. 0 даже.

Если бы вы вместо этого использовали std::round в этом режиме полпути округляются «вверх» (от нуля), и это приведет к 1,

Увидеть документация для std::rint.

Зачем Вы могли бы хотеть эту необычную форму округления объяснил на Mathematica.SE. (поэтому ваши данные не все сдвинуты в одном направлении).

Кроме того, C ++ предоставляет правильно упакованную версию стандартных заголовков с именами, добавленными к std пространство имен (хотя это вряд ли имеет значение здесь): это обычно #include <cfenv> скорее, чем #include <fenv.h>,

7

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]