_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 di S edizione Standard. 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 S edizione Standard 2, 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 S edizione Standard 2. 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