Maison > développement back-end > C++ > Comment puis-je ajuster de manière portable le comportement d'arrondi à virgule flottante en C et en assemblage ?

Comment puis-je ajuster de manière portable le comportement d'arrondi à virgule flottante en C et en assemblage ?

Linda Hamilton
Libérer: 2024-11-24 17:34:16
original
1013 Les gens l'ont consulté

How Can I Portably Adjust Floating-Point Rounding Behavior in C and Assembly?

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

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

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!

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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal