_status87
, _statusfp
, _statusfp2
Ottiene la parola di stato nelle operazioni a virgola mobile.
Sintassi
unsigned int _status87( void );
unsigned int _statusfp( void );
void _statusfp2(unsigned int *px86, unsigned int *pSSE2)
Parametri
px86
Questo indirizzo viene compilato con la parola di stato per l'unità di calcolo in virgola mobile x87.
pSSE2
Questo indirizzo viene compilato con la parola di stato per l'unità di calcolo in virgola mobile SSE2.
Valore restituito
Per _status87
e _statusfp
, i bit nel valore restituito indicano lo stato dell'operazione a virgola mobile. Per una definizione completa dei bit restituiti da _statusfp
, vedere il file di inclusione FLOAT.H. Molte funzioni della libreria matematica modificano la parola di stato nelle operazioni a virgola mobile, con risultati imprevisti. Le funzionalità di ottimizzazione possono riordinare, combinare ed eliminare operazioni a virgola mobile per le chiamate a _status87
, _statusfp
e funzioni correlate. Usare l'opzione del compilatore /Od (Disable (Debug)) o la fenv_access
direttiva pragma per impedire ottimizzazioni che riordinano le operazioni a virgola mobile. I valori restituiti da _clearfp
e _statusfp
e anche i parametri restituiti da _statusfp2
sono più affidabili se vengono eseguite meno operazioni a virgola mobile tra gli stati noti della parola di stato nelle operazioni a virgola mobile.
Osservazioni:
La funzione _statusfp
ottiene la parola di stato nelle operazioni a virgola mobile. La parola di stato è una combinazione dello stato del processore a virgola mobile e di altre condizioni rilevate dal gestore delle eccezioni a virgola mobile, come ad esempio l'overflow e underflow di stack a virgola mobile. Le eccezioni non mascherate vengono controllate prima della restituzione del contenuto della parola di stato. In altre parole, il chiamante viene informato delle eccezioni in sospeso. Nelle piattaforme x86 _statusfp
restituisce una combinazione dello stato a virgola mobile x87 e SSE2. Nelle piattaforme x64 lo stato restituito è basato sullo stato MXCSR della SSE. Nelle piattaforme ARM64, restituisce _statusfp
lo stato dal registro FPSCR.
_statusfp
è una versione indipendente dalla piattaforma e portabile di _status87
. È identico alle _status87
piattaforme Intel (x86) ed è supportato anche dalle piattaforme x64 e ARM64. Per assicurarsi che il codice a virgola mobile sia portabile su tutte le architetture, usare _statusfp
. Se si usa solo piattaforme x86, è possibile usare _status87
o _statusfp
.
È consigliabile usare _statusfp2
per chip (ad esempio Pentium IV) che hanno un processore a virgola mobile sia x87 che SSE2. Per _statusfp2
, gli indirizzi vengono compilati usando la parola di stato nelle operazioni a virgola mobile sia per il processore a virgola mobile x87 che SSE2. Per un chip che supporta processori a virgola mobile x87 e SSE2, EM_AMBIGUOUS
è impostato su 1 se _statusfp
o _controlfp
viene usata e l'azione è ambigua perché può fare riferimento alla parola di stato a virgola mobile x87 o SSE2. La funzione _statusfp2
è supportata solo nelle piattaforme x86.
Queste funzioni non sono utili per /clr (compilazione Common Language Runtime) perché Common Language Runtime (CLR) supporta solo la precisione a virgola mobile predefinita.
Requisiti
Ciclo | Intestazione obbligatoria |
---|---|
_status87 , _statusfp , _statusfp2 |
<float.h> |
Per altre informazioni sulla compatibilità, vedere Compatibility (Compatibilità).
Esempio
// 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
Vedi anche
Supporto matematico e a virgola mobile
_clear87
, _clearfp
_control87
, _controlfp
, __control87_2