Partager via


_status87, _statusfp, _statusfp2

Obtient le mot d’état de virgule flottante.

Syntaxe

unsigned int _status87( void );
unsigned int _statusfp( void );
void _statusfp2(unsigned int *px86, unsigned int *pSSE2)

Paramètres

px86
Cette adresse est complétée avec le mot d’état de l’unité de virgule flottante x87.

pSSE2
Cette adresse est complétée avec le mot d’état de l’unité de virgule flottante SSE2.

Valeur retournée

Pour _status87 et _statusfp, les bits contenus dans la valeur retournée indiquent l’état de virgule flottante. Pour obtenir une définition des bits retournés par _statusfp, consultez le fichier Include FLOAT.H. Une part importante des fonctions de bibliothèque mathématique modifie le mot d’état de virgule flottante, avec des résultats imprévisibles. L’optimisation permet de réorganiser, combiner et éliminer les opérations en virgule flottante autour des appels à _status87, _statusfp et des fonctions associées. Utilisez l’option du compilateur /Od (Désactiver (Déboguer)) ou la fenv_access directive pragma pour empêcher les optimisations qui réorganisent les opérations à virgule flottante. Les valeurs de retour de _clearfp et _statusfp, de même que les paramètres de retour de _statusfp2, sont d’autant plus fiables que le nombre d’opérations en virgule flottante exécutées entre les états connus du mot d’état de virgule flottante est limité.

Notes

La fonction _statusfp obtient le mot d’état de virgule flottante. Le mot d’état est une combinaison de l’état du processeur de virgule flottante et d’autres conditions détectées par le gestionnaire d’exceptions de virgule flottante, par exemple le dépassement de capacité positif et négatif de pile en virgule flottante. Les exceptions démasquées sont vérifiées avant que le contenu du mot d’état soit retourné. En d’autres termes, l’appelant est informé des exceptions en attente. Sur les plateformes X86, _statusfp retourne une combinaison de l’état de virgule flottante x87 et SSE2. Sur les plateformes x64, l’état retourné est basé sur l’état MXCSR de SSE. Sur les plateformes ARM64, _statusfp retourne l’état du registre FPSCR.

_statusfp est une version portable indépendante de la plateforme de _status87. Il est identique aux _status87 plateformes Intel (x86) et est également pris en charge par les plateformes x64 et ARM64. Pour assurer la portabilité de votre code en virgule flottante vers toutes les architectures, utilisez _statusfp. Si vous ciblez uniquement des plateformes x86, vous pouvez utiliser l’une ou _statusfpl’autre _status87 .

Nous vous recommandons _statusfp2 pour les puces (telles que Pentium IV) qui sont équipées de processeurs en virgule flottante x87 et SSE2. Pour _statusfp2, les adresses sont complétées avec le mot d’état de virgule flottante pour le processeur en virgule flottante x87 ou SSE2. Pour une puce qui prend en charge les processeurs à virgule flottante x87 et SSE2, EM_AMBIGUOUS est définie sur 1 si _statusfp ou _controlfp est utilisée et l’action était ambiguë, car elle pouvait faire référence au mot d’état x87 ou SSE2 à virgule flottante. La fonction _statusfp2 n’est prise en charge que sur les plateformes x86.

Ces fonctions ne sont pas utiles pour /clr (Compilation Common Language Runtime), car le Common Language Runtime (CLR) prend uniquement en charge la précision à virgule flottante par défaut.

Spécifications

Routine En-tête requis
_status87, _statusfp, _statusfp2 <float.h>

Pour plus d’informations sur la compatibilité, consultez Compatibility.

Exemple

// crt_statusfp.c
// Build by using: cl /W4 /Ox /nologo crt_statusfp.c
// This program creates various floating-point errors and
// then uses _statusfp to display messages that indicate these problems.

#include <stdio.h>
#include <float.h>
#pragma fenv_access(on)

double test( void )
{
   double a = 1e-40;
   float b;
   double c;

   printf("Status = 0x%.8x - clear\n", _statusfp());

   // Assignment into b is inexact & underflows:
   b = (float)(a + 1e-40);
   printf("Status = 0x%.8x - inexact, underflow\n", _statusfp());

   // c is denormal:
   c = b / 2.0;
   printf("Status = 0x%.8x - inexact, underflow, denormal\n",
            _statusfp());

   // Clear floating point status:
   _clearfp();
   return c;
}

int main(void)
{
   return (int)test();
}
Status = 0x00000000 - clear
Status = 0x00000003 - inexact, underflow
Status = 0x00080003 - inexact, underflow, denormal

Voir aussi

Prise en charge mathématique et à virgule flottante
_clear87, _clearfp
_control87, _controlfp, __control87_2