Ajustement portable du comportement d'arrondi à virgule flottante
La nécessité de modifier le mode d'arrondi IEEE 754 survient dans divers scénarios. Cet article explique les méthodes efficaces pour y parvenir, à la fois en C portable et en utilisant le langage d'assemblage x86.
Solution C
C99 fournit une solution complète pour manipuler les modes d'arrondi :
#include <fenv.h> #pragma STDC FENV_ACCESS ON int main() { // Preserve the initial rounding mode const int roundingMode = fegetround(); // Set the desired rounding mode (towards zero) fesetround(FE_TOWARDZERO); // Perform floating-point operations... // Revert to the original rounding mode fesetround(roundingMode); return 0; }
Solution d'assemblage x86
Sur les plateformes non prenant en charge C99, l'assemblage x86 offre une alternative :
Unité à virgule flottante x87 : Utilisez fldcw pour ajuster le mode d'arrondi.
Unité SSE : Utilisez ldmxcsr pour configurer l'arrondi SIMD mode.
Solution spécifique à MSVC
Microsoft Visual C fournit la fonction _controlfp() non standard :
unsigned int roundingMode = _controlfp(0, 0); _controlfp(_RC_CHOP, _MCW_RC); // ... _controlfp(roundingMode, _MCW_RC);
Arrondi Constantes de mode
Le tableau suivant fournit une référence pour le mode d'arrondi constantes :
Rounding Mode | C Name | MSVC Name |
---|---|---|
Nearest | FE_TONEAREST | _RC_NEAR |
Towards Zero | FE_TOWARDZERO | _RC_CHOP |
Positive Infinity | FE_UPWARD | _RC_UP |
Negative Infinity | FE_DOWNWARD | _RC_DOWN |
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!