Manipulation des modes d'arrondi à virgule flottante : une approche efficace
L'amélioration des opérations à virgule flottante implique souvent de contrôler leur mode d'arrondi, qui détermine la façon dont les résultats sont arrondis après calculs. Cet article explore les techniques les plus efficaces pour modifier le mode d'arrondi, s'adressant à la fois aux fonctions C portables et aux solutions d'assemblage x86.
Fonction C portable :
La norme C99 fournit les fonctions fegetround() et fesetround() pour obtenir et définir le mode d'arrondi. Voici un extrait de code présentant leur utilisation :
#include <fenv.h> #pragma STDC FENV_ACCESS ON int main() { // Store the initial rounding mode int originalRounding = fegetround(); // Set the rounding mode to round towards zero fesetround(FE_TOWARDZERO); // Perform calculations and rounding operations // Reset the original rounding mode fesetround(originalRounding); return 0; }
Solution d'assemblage x86 :
Si vous ciblez des plates-formes ne prenant pas en charge C99, utilisez les instructions d'assemblage x86 pour manipuler les modes d'arrondi. . Cela implique le réglage à la fois de l'unité x87 (via fldcw) et de SSE (via ldmxcsr).
Solution spécifique à MSVC :
Pour Microsoft Visual C (MSVC), exploiter la fonction non standard _controlfp() au lieu de l'assembly approche.
unsigned int originalRounding = _controlfp(0, 0); _controlfp(_RC_CHOP, _MCW_RC); // Perform calculations and rounding operations _controlfp(originalRounding, _MCW_RC);
Anneau de décodeur de mode d'arrondi :
Pour référence, voici un anneau de décodeur pour les différents modes d'arrondi et leurs macros C et MSVC correspondantes :
Rounding Mode | C Macro | MSVC Macro |
---|---|---|
Nearest | FE_TONEAREST | _RC_NEAR |
Towards Zero | FE_TOWARDZERO | _RC_CHOP |
Towards Infinity | FE_UPWARD | _RC_UP |
Towards -Infinity | FE_DOWNWARD | _RC_DOWN |
Ces techniques fournissent des moyens efficaces de contrôler les modes d'arrondi à virgule flottante, permettant des calculs et des résultats optimisés.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!