Modification efficace de l'arrondi à virgule flottante dans les assemblages C et x86
Les nombres à virgule flottante IEEE 754 offrent différents modes d'arrondi, tels que le plus proche, zéro, l'infini positif et l'infini négatif. La modification du mode d'arrondi permet un contrôle précis sur la représentation décimale des résultats.
Solution C
La bibliothèque standard C fournit une solution portable pour modifier les modes d'arrondi via le fesetround( ) fonction :
#include <fenv.h> #pragma STDC FENV_ACCESS ON int main() { // Save the original rounding mode int originalRounding = fegetround(); // Set the desired rounding mode (e.g., to zero) fesetround(FE_TOWARDZERO); // Perform operations with the adjusted rounding mode // Restore the original rounding mode fesetround(originalRounding); return 0; }
Solution d'assemblage x86
Pour plates-formes sans support C99, l'assemblage x86 peut être utilisé pour modifier à la fois l'unité x87 et les modes d'arrondi SSE :
; x87 unit fldcw [new rounding mode] ; e.g., FNINIT to nearest ; SSE ldmxcsr [new rounding mode] ; e.g., MXCSR_RND_NEAREST
Microsoft Visual C
MSVC offre le non- Fonction standard _controlfp() à cet effet :
#include <math.h> int main() { // Save the original rounding mode unsigned int originalRounding = _controlfp(0, 0); // Set the desired rounding mode (e.g., to zero) _controlfp(_RC_CHOP, _MCW_RC); // Perform operations with the adjusted rounding mode // Restore the original rounding mode _controlfp(originalRounding, _MCW_RC); return 0; }
Décodeur de mode d'arrondi Bague
Rounding Mode | C Name | MSVC Name |
---|---|---|
Nearest | FE_TONEAREST | _RC_NEAR |
Zero | FE_TOWARDZERO | _RC_CHOP |
Infinity | FE_UPWARD | _RC_UP |
-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!