_status87
, _statusfp
, _statusfp2
Obtém a palavra de status de ponto flutuante.
Sintaxe
unsigned int _status87( void );
unsigned int _statusfp( void );
void _statusfp2(unsigned int *px86, unsigned int *pSSE2)
Parâmetros
px86
Esse endereço é preenchido com a palavra de status para a unidade de ponto flutuante x87.
pSSE2
Esse endereço é preenchido com a palavra de status para a unidade de ponto flutuante SSE2.
Valor retornado
Para _status87
e _statusfp
, os bits no valor retornado indicam o status de ponto flutuante. Consulte o arquivo FLOAT.H incluído para obter uma definição dos bits retornados por _statusfp
. Muitas funções de biblioteca de matemática modificam a palavra de status de ponto flutuante, com resultados imprevisíveis. A otimização pode reordenar, combinar e eliminar as operações de ponto flutuante em torno das chamadas para _status87
, _statusfp
e funções relacionadas. Use a opção do compilador /Od (Desabilitar (Depurar)) ou a fenv_access
diretiva pragma para evitar otimizações que reordenam operações de ponto flutuante. Valores retornados de _clearfp
e _statusfp
e também os parâmetros de retorno de _statusfp2
serão mais confiáveis se houver menos operações de ponto flutuantes entre estados conhecidos da palavra de status de ponto flutuante.
Comentários
A função _statusfp
obtém a palavra de status de ponto flutuante. A palavra de status é uma combinação do status do processador de ponto flutuante e outras condições detectadas pelo manipulador de exceção de ponto flutuante – por exemplo, estouro positivo e negativo de pilha de ponto flutuante. Exceções sem máscara são verificadas antes de o conteúdo da palavra de status ser retornado. Em outras palavras, o chamador é informado sobre exceções pendentes. Em plataformas x86, _statusfp
retorna uma combinação dos status de ponto flutuante SSE2 e x87. Em plataformas x64, o status retornado é baseado no status MXCSR do SSE. Em plataformas ARM64, _statusfp
retorna o status do registro FPSCR.
_statusfp
é uma versão portátil e independente de plataforma de _status87
. É idêntico às _status87
plataformas Intel (x86) e também é suportado pelas plataformas x64 e ARM64. Para garantir que seu código de ponto flutuante seja portátil para todas as arquiteturas, use _statusfp
. Se você estiver segmentando apenas plataformas x86, poderá usar um ou _status87
_statusfp
.
Recomendamos _statusfp2
para chips (como Pentium IV) que têm um ambos um processador de ponto flutuante x87 e um SSE2. Para _statusfp2
, os endereços são preenchidos pelo uso da palavra de status de ponto flutuante tanto para o processador de ponto flutuante x87 quanto para o SSE2. Para um chip que dá suporte a processadores de ponto flutuante x87 e SSE2, EM_AMBIGUOUS
é definido como 1 se _statusfp
ou _controlfp
é usado e a ação era ambígua porque poderia se referir à palavra de status de ponto flutuante x87 ou SSE2. Só há suporte para a função _statusfp2
em plataformas x86.
Essas funções não são úteis para /clr (Common Language Runtime Compilation) porque o CLR (Common Language Runtime) dá suporte apenas à precisão de ponto flutuante padrão.
Requisitos
Rotina | Cabeçalho necessário |
---|---|
_status87 , _statusfp , _statusfp2 |
<float.h> |
Para obter informações sobre compatibilidade, consulte Compatibilidade.
Exemplo
// 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
Confira também
Suporte matemático e de ponto flutuante
_clear87
, _clearfp
_control87
, _controlfp
, __control87_2