_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.

Retornar valor

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 de compilador /Od (Disable (Debug)) ou a fenv_access diretiva pragma para impedir 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 das 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 ao _status87 das 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 _status87 ou _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 suporta processadores de ponto flutuante x87 e SSE2, EM_AMBIGUOUS é definido como 1 se ou é usado e a ação era ambígua porque poderia se _statusfp referir à palavra de status de ponto flutuante x87 ou _controlfp 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) oferece 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 a matemática e ponto flutuante
_clear87, _clearfp
_control87, _controlfp, __control87_2