Condividi tramite


_status87, _statusfp, _statusfp2

Ottiene la parola di stato a virgola mobile.

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

Parametri

  • px86
    Questo indirizzo viene riempito con parola di stato dell'unità in virgola mobile x87.

  • pSSE2
    Questo indirizzo viene riempito con parola di stato dell'unità in virgola mobile SSE2.

Valore restituito

Per _status87 e _statusfp, i bit nel valore restituito indica lo stato della virgola mobile. Vedere il file di inclusione FLOAT.H per una definizione dei bit restituiti da _statusfp. Molte funzioni matematiche della libreria modificano la parola di stato a virgola mobile, con risultati imprevisti. L'ottimizzazione può riordinare, combinare e rimuovere operazioni a virgola mobile attorno alle chiamate a _status87, _statusfp e funzioni correlate. Utilizzare l'opzione del compilatore /Od (Disabilita (Debug)) o la direttiva pragma fenv_access per impedire che le ottimizzazioni riordinano operazioni a virgola mobile. I valori restituiti da _clearfp e _statusfpnonché i parametri restituiti da _statusfp2, sono più efficaci se meno operazioni a virgola mobile vengono eseguite tra gli stati noti della parola di stato a virgola mobile.

Note

La funzione _statusfp ottiene la parola di stato a virgola mobile. La parola di stato è una combinazione dello stato del processore a virgola mobile e di altre condizioni rilevate dal gestore di eccezioni a virgola mobile, ad esempio un overflow dello stack a virgola mobile e l'underflow. Le eccezioni smascherate vengono archiviate prima che il contenuto della parola di stato venga restituito. Ciò significa che il chiamante è consapevole delle eccezioni in corso. Su piattaforme x86, _statusfp restituisce una combinazione degli stati della virgola mobile x87 e SSE2. Su piattaforme x64, lo stato restituito è basato sullo stato del MXCSR di SSE. Su piattaforme ARM, _statusfp restituisce lo stato dal registro FPSCR.

_statusfp è una versione indipendente dalla piattaforma e portabile di _status87. È identica a _status87 su piattaforme Intel (x86) e viene supportata dalle piattaforme x64 e ARM. Per assicurarsi che il codice a virgola mobile sia portabile a tutte le architetture, utilizzare _statusfp. Se si intende utilizzare solo le piattaforme x86, è possibile utilizzare _status87 o _statusfp.

Si consiglia _statusfp2 per i chip (come il processore Pentium IV) che dispongono sia di un x87 che di un processore a virgola mobile SSE2. Per _statusfp2, gli indirizzi sono riempiti con la parola di stato a virgola mobile per entrambi i processori a virgola mobile x87 o SSE2. Per un chip che supporta i processori a virgola mobile x87 e SSE2, EM_AMBIGUOUS è impostato su 1 se _statusfp o si utilizza _controlfp e l'azione è ambigua poiché potrebbe 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 la compilazione /clr (Compilazione Common Language Runtime) o /clr:pure perché Common Language Runtime (CLR) supporta solo la precisione dei valori a virgola mobile predefinita.

Requisiti

Routine

Intestazione obbligatoria

_status87, _statusfp, _statusfp2

<float.h>

Per ulteriori informazioni sulla compatibilità, vedere 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();
}
  

Equivalente .NET Framework

Non applicabile. Per chiamare la funzione standard C, utilizzare PInvoke. Per ulteriori informazioni, vedere Esempi di platform invoke.

Vedere anche

Riferimenti

Supporto a virgola mobile

_clear87, _clearfp

_control87, _controlfp, __control87_2