_status87, _statusfp, _statusfp2

Obtiene la palabra de estado de punto flotante.

Sintaxis

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

Parámetros

px86
Esta dirección se rellena con la palabra de estado para la unidad de punto flotante x87.

pSSE2
Esta dirección se rellena con la palabra de estado para la unidad de punto flotante SSE2.

Valor devuelto

En el caso de _status87 y _statusfp, los bits del valor devuelto indican el estado de punto flotante. Vea el archivo de inclusión de FLOAT.H para obtener una definición de los bits devueltos por _statusfp. Muchas funciones de la biblioteca matemática modifican la palabra de estado de punto flotante, con resultados imprevisibles. La optimización puede reordenar, combinar y eliminar operaciones de punto flotante en torno a llamadas a _status87, _statusfp y funciones relacionadas. Use la opción del compilador /Od (Deshabilitar (depurar)) o la fenv_access directiva pragma para evitar optimizaciones que reordenen las operaciones de punto flotante. Los valores devueltos de _clearfp y _statusfp, así como los parámetros devueltos de _statusfp2, son más confiables si se realizan menos operaciones de punto flotante entre estados conocidos de la palabra de estado de punto flotante.

Comentarios

La función _statusfp obtiene la palabra de estado de punto flotante. La palabra de estado es una combinación del estado de procesador de punto flotante y otras condiciones detectadas por el controlador de excepciones de punto flotante, por ejemplo, desbordamiento y subdesbordamiento de la pila de punto flotante. Las excepciones sin máscara se comprueban antes de que se devuelva el contenido de la palabra de estado. En otras palabras, se informa al autor de la llamada de las excepciones pendientes. En plataformas x86, _statusfp devuelve una combinación del estado de punto flotante de x87 y SSE2. En las plataformas x64, el estado devuelto se basa en el estado MXCSR de SSE. En las plataformas ARM64, _statusfp devuelve el estado del registro FPSCR.

_statusfp es una versión independiente de la plataforma y portable de _status87. Es idéntico a _status87 en plataformas Intel (x86) y también es compatible con las plataformas x64 y ARM64. Para asegurarse de que el código de punto flotante se puede llevar a todas las arquitecturas, use _statusfp. Si solo tiene como destino plataformas x86, puede usar _status87 o _statusfp.

Se recomienda _statusfp2 para los chips (como Pentium IV) que tienen procesadores de punto flotante de x87 y de SSE2. En el caso de _statusfp2, las direcciones se rellenan usando la palabra de estado de punto flotante para el procesador de punto flotante de x87 o de SSE2. Para un chip que admita procesadores de punto flotante x87 y SSE2, EM_AMBIGUOUS se establece en 1 si _statusfp se usa o _controlfp y la acción era ambigua porque podía hacer referencia a la palabra de estado de punto flotante X87 o SSE2. La función _statusfp2 solo se admite en plataformas x86.

Estas funciones no son útiles para /clr (compilación de Common Language Runtime) porque Common Language Runtime (CLR) solo admite la precisión de punto flotante predeterminada.

Requisitos

Routine Encabezado necesario
_status87, _statusfp, _statusfp2 <float.h>

Para obtener más información sobre compatibilidad, consulte Compatibilidad.

Ejemplo

// 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

Consulte también

Compatibilidad con matemáticas y punto flotante
_clear87, _clearfp
_control87, _controlfp, __control87_2