Maison > développement back-end > C++ > Comment puis-je modifier efficacement le mode d'arrondi des nombres à virgule flottante IEEE 754 en C ?

Comment puis-je modifier efficacement le mode d'arrondi des nombres à virgule flottante IEEE 754 en C ?

Barbara Streisand
Libérer: 2024-12-11 13:02:11
original
779 Les gens l'ont consulté

How Can I Efficiently Change the Rounding Mode for IEEE 754 Floating-Point Numbers in C?

Changement du mode d'arrondi pour les nombres à virgule flottante IEEE 754

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.

Solutions basées sur C :

Pour le code C portable, la solution standard consiste à exploiter le bibliothèque et utilise la fonction fesetround(). Cette fonction permet aux programmeurs de définir le mode d'arrondi souhaité (par exemple, vers le plus proche, vers zéro ou vers l'infini positif/négatif).

#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);
Copier après la connexion

Solutions basées sur l'assemblage :

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.

Solution spécifique MSVC :

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);
Copier après la connexion

Décodage du mode d'arrondi :

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal