2016-01-11 10 views
3

Может кто-нибудь объяснить, почему rounding 0.5 до FE_TONEAREST дает 0? Разве это не должно давать «1»? Есть ли способ «исправить» это?C++ rounding to FE_TONEAREST

#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; 
} 

Runnable код на coliru: http://coliru.stacked-crooked.com/a/9c179ca56f251628

+0

Это только предложение. Но может быть, это что-то напольное и потолочное? ** ОБНОВЛЕНИЕ **: да, это [ссылка] (http://www.cplusplus.com/reference/cfenv/fesetround/) – Mikhail

ответ

7

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

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

См. documentation for std::rint.

Почему вы, возможно, захотите, чтобы эта необычная форма округления была explained over on Mathematica.SE. (поэтому ваши данные не все перемещаются в одном направлении).

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

+1

Хорошее объяснение, почему округление до ** даже ** целого числа необходимо для [объективных результатов ] (http://mathematica.stackexchange.com/questions/2116/why-round-to-even-integers) –

+0

Спасибо, я добавлю это к ответу. – BoBTFish