Maison > développement back-end > C++ > le corps du texte

Comment puis-je contrôler efficacement les modes d'arrondi à virgule flottante dans les assemblages C et x86 ?

Barbara Streisand
Libérer: 2024-11-27 12:41:14
original
346 Les gens l'ont consulté

How Can I Efficiently Control Floating-Point Rounding Modes in C and x86 Assembly?

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

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

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

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!

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