_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 _statusfp
l’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 des fonctions mathématiques et à virgule flottante
_clear87
, _clearfp
_control87
, , _controlfp
__control87_2