45 votes

Changer le mode d'arrondi en virgule flottante

Quelle est la manière la plus efficace de changer le mode d'arrondi * des nombres à virgule flottante IEEE 754? Une fonction C portable serait bien, mais une solution qui utilise l'assemblage x86 est également correcte.

* Je fais référence aux modes d'arrondi standard de vers le plus proche, vers zéro et vers l'infini positif / négatif

44voto

Stephen Canon Points 58003

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

-5voto

Nick Points 2689

cela pourrait aider.

Edit: je dirais que vous auriez besoin de votre propre fonction. Vous pouvez utiliser de l'assemblée à l'intérieur de C.

Mais si vous vous inscrivez taille est 64bits, autour d'elle à 32 bits serait de faire vos calculs plus rapidement. Il sera effectivement rendre plus lent. Rappelez-vous 64bit calculs est facile pour un microprocesseur 64 au lieu de 2-32bit. Je ne sais pas exactement ce que vous voulez atteindre. Je sais que la performance est à vos critères.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X