Это стандартное решение C:
#include <fenv.h>
#pragma STDC FENV_ACCESS ON
// store the original rounding mode
const int originalRounding = fegetround( );
// establish the desired rounding mode
fesetround(FE_TOWARDZERO);
// do whatever you need to do ...
// ... and restore the original mode afterwards
fesetround(originalRounding);
На обратных платформах, не поддерживающих C99, возможно, вам придется прибегнуть к сборке. В этом случае может потребоваться установить округление как для устройства x87 (с помощью инструкции fldcw
), так и для SSE (с помощью инструкции ldmxcsr
).
Редактировать
Вам не нужно прибегать к сборке для MSVC. Вы можете использовать (совершенно нестандартно) _controlfp( )
вместо:
unsigned int originalRounding = _controlfp(0, 0);
_controlfp(_RC_CHOP, _MCW_RC);
// do something ...
_controlfp(originalRounding, _MCW_RC);
Подробнее о _controlfp () вы можете прочитать в MSDN .
И, просто для полноты, кольцо декодера для имен макросов для режимов округления:
rounding mode C name MSVC name
-----------------------------------------
to nearest FE_TONEAREST _RC_NEAR
toward zero FE_TOWARDZERO _RC_CHOP
to +infinity FE_UPWARD _RC_UP
to -infinity FE_DOWNWARD _RC_DOWN