_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
Vea también
Compatibilidad con cálculos matemáticos y el punto flotante
_clear87
, _clearfp
_control87
, , _controlfp
, __control87_2