C'est le standard C solution:
#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);
Sur l'arrière des plates-formes dépourvues de support C99, vous pourriez avoir besoin de recourir à l'assemblée. Dans ce cas, vous souhaiterez peut-être définir l'arrondissement pour le x87 unité (via l' fldcw
instruction) et l'ESS (via l' ldmxcsr
enseignement).
Modifier
Vous n'avez pas besoin de recourir à l'assemblée pour MSVC. Vous pouvez utiliser l' (totalement non-standard) _control_fp( )
à la place:
unsigned int originalRounding = _control_fp(0, 0);
_control_fp(_RC_CHOP, _MCW_RC);
// do something ...
_control_fp(originalRounding, _MCW_RC);
Vous pouvez en lire plus à propos de _control_fp( ) sur MSDN.
Et, juste pour être complet, un anneau de décodeur pour les noms de macro pour les modes d'arrondi:
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