Ответ 1
Это стандартное решение 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