Compartilhar via


_fpieee_flt

Invoca um manipulador de interceptação definido pelo usuário para exceções de ponto flutuante do IEEE.

Sintaxe

int _fpieee_flt(
   unsigned long excCode,
   struct _EXCEPTION_POINTERS *excInfo,
   int handler(_FPIEEE_RECORD *)
);

Parâmetros

excCode
Código da exceção.

excInfo
Ponteiro para a estrutura de informações de exceção do Windows NT.

handler
Ponteiro para a rotina do manipulador de interceptação do IEEE do usuário.

Valor retornado

O valor retornado de _fpieee_flt é o valor retornado por handler. Sendo assim, a rotina de filtro do IEEE pode ser usada na cláusula except de um mecanismo de SEH (manipulação de exceção estruturada).

Comentários

A função _fpieee_flt invoca um manipulador de interceptação definido pelo usuário para exceções de ponto flutuante do IEEE e fornece a ele todas as informações relevantes. Essa rotina serve como um filtro de exceção no mecanismo de SEH, que invoca seu próprio manipulador de exceção do IEEE quando necessário.

A estrutura _FPIEEE_RECORD, definida em Fpieee.h, contém informações referentes a uma exceção de ponto flutuante do IEEE. Essa estrutura é passada para o manipulador de interceptação definido pelo usuário por _fpieee_flt.

Campo _FPIEEE_RECORD Descrição
RoundingMode
Precision
Esses campos unsigned int contêm informações sobre o ambiente de ponto flutuante do momento em que a exceção ocorreu.
Operation Esse campo unsigned int indica o tipo de operação que causou a interceptação. Se o tipo for uma comparação (_FpCodeCompare), você poderá fornecer um dos valores especiais _FPIEEE_COMPARE_RESULT (conforme definido em Fpieee.h) no campo Result.Value . O tipo de conversão (_FpCodeConvert) indica que a interceptação ocorreu durante uma operação de conversão de ponto flutuante. Examine os tipos Operand1 e Result para determinar o tipo de conversão que está sendo tentada.
Operand1
Operand2
Result
Essas _FPIEEE_VALUE estruturas indicam os tipos e valores do resultado e dos operandos propostos. Cada escopo contém estes campos:

OperandValid - Sinalizador que indica se o valor de resposta é válido.
Format - Tipo de dados do valor correspondente. O tipo de formato pode ser retornado mesmo que o valor correspondente não seja válido.
Value - Valor de dados do resultado ou do operando.
Cause
Enable
Status
_FPIEEE_EXCEPTION_FLAGS contém um campo de bits para cada tipo de exceção de ponto flutuante. Há uma correspondência entre esses campos e os argumentos usados para mascarar as exceções fornecidas ao _controlfp. O significado exato de cada bit depende do contexto:

Cause - Cada bit definido indica a exceção específica que foi gerada.
Enable - Cada bit definido indica que a exceção específica está desmascarada no momento.
Status - Cada bit definido indica que a exceção específica está pendente no momento, o que inclui exceções que não foram geradas porque foram mascaradas por _controlfp.

Exceções pendentes desabilitadas são geradas quando você as habilita. Essas exceções podem resultar em comportamento indefinido ao usar _fpieee_flt como um filtro de exceção. Sempre chame _clearfp antes de habilitar exceções de ponto flutuante.

Requisitos

Função Cabeçalho necessário
_fpieee_flt <fpieee.h>

Para obter informações sobre compatibilidade, consulte Compatibilidade.

Exemplo

// crt_fpieee.c
// This program demonstrates the implementation of
// a user-defined floating-point exception handler using the
// _fpieee_flt function.

#include <fpieee.h>
#include <excpt.h>
#include <float.h>
#include <stddef.h>

int fpieee_handler( _FPIEEE_RECORD * );

int fpieee_handler( _FPIEEE_RECORD *pieee )
{
   // user-defined ieee trap handler routine:
   // there is one handler for all
   // IEEE exceptions

   // Assume the user wants all invalid
   // operations to return 0.

   if ((pieee->Cause.InvalidOperation) &&
       (pieee->Result.Format == _FpFormatFp32))
   {
        pieee->Result.Value.Fp32Value = 0.0F;

        return EXCEPTION_CONTINUE_EXECUTION;
   }
   else
      return EXCEPTION_EXECUTE_HANDLER;
}

#define _EXC_MASK    \
    _EM_UNDERFLOW  + \
    _EM_OVERFLOW   + \
    _EM_ZERODIVIDE + \
    _EM_INEXACT

int main( void )
{
   // ...

   __try {
      // unmask invalid operation exception
      _controlfp_s(NULL, _EXC_MASK, _MCW_EM);

      // code that may generate
      // fp exceptions goes here
   }
   __except ( _fpieee_flt( GetExceptionCode(),
                GetExceptionInformation(),
                fpieee_handler ) ){

      // code that gets control

      // if fpieee_handler returns
      // EXCEPTION_EXECUTE_HANDLER goes here

   }

   // ...
}

Confira também

Suporte matemático e de ponto flutuante
_control87, _controlfp, __control87_2
_controlfp_s