Dans le domaine du calcul numérique, le maintien de la précision et le contrôle des erreurs d'arrondi sont cruciaux. Les nombres à virgule flottante IEEE 754 fournissent des mécanismes standardisés pour représenter et manipuler des nombres réels tout en proposant différents modes d'arrondi pour répondre à différentes exigences de précision.
Cette question explore l'approche la plus efficace pour modifier le mode d'arrondi des nombres flottants IEEE 754. -numéros de points. L'accent principal est mis sur les solutions C portables, bien que des solutions d'assemblage pour les plates-formes x86 soient également explorées.
Pour le code C portable, la solution standard consiste à exploiter le
#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); // Perform desired operations... // ... // Restore the original mode afterwards fesetround(originalRounding);
Pour les anciennes plates-formes faute de support C99, des solutions d’assemblage pourraient être nécessaires. Dans de tels scénarios, l'ajustement du mode d'arrondi implique généralement de modifier les bits de contrôle de l'unité x87 via l'instruction fldcw et de l'unité SSE via l'instruction ldmxcsr.
Pour Microsoft Visual C (MSVC), une option non standard mais pratique est disponible. La fonction _controlfp() peut être utilisée pour manipuler le mode d'arrondi.
unsigned int originalRounding = _controlfp(0, 0); _controlfp(_RC_CHOP, _MCW_RC); // Perform desired operations... // ... _controlfp(originalRounding, _MCW_RC);
Pour référence, les différents modes d'arrondi et leurs noms C et MSVC correspondants sont répertoriés ci-dessous. :
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 |
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!