Compartir por


_fpieee_flt

Invoca un controlador de interceptaciones definido por el usuario para las excepciones de punto flotante del IEEE.

Sintaxis

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

Parámetros

excCode
Código de la excepción.

excInfo
Puntero a la estructura de información de excepción de Windows NT.

handler
Puntero a la rutina del controlador de interceptaciones del IEEE del usuario.

Valor devuelto

El valor devuelto de _fpieee_flt es el valor devuelto por handler. Por tanto, la rutina de filtro del IEEE podría usarse en la cláusula de excepción de un mecanismo de control de excepciones estructurado (SEH).

Comentarios

La función _fpieee_flt invoca un controlador de interceptaciones definido por el usuario para las excepciones de punto flotante del IEEE y le proporciona toda la información pertinente. Esta rutina actúa como filtro de excepciones en el mecanismo de SEH, que invoca el controlador de excepciones del IEEE propio cuando es necesario.

La estructura _FPIEEE_RECORD, definida en Fpieee.h, contiene información relativa a una excepción de punto flotante del IEEE. _fpieee_flt pasa esta estructura al controlador de interceptaciones definido por el usuario.

campo _FPIEEE_RECORD Descripción
RoundingMode
Precision
Estos campos unsigned int contienen información sobre el entorno de punto flotante en el momento que se produjo la excepción.
Operation El campo unsigned int indica el tipo de operación que produjo la interceptación. Si el tipo es una comparación (_FpCodeCompare), puede proporcionar uno de los valores especiales _FPIEEE_COMPARE_RESULT (como se define en Fpieee.h) en el campo Result.Value . El tipo de conversión (_FpCodeConvert) indica que la interceptación se produjo durante una operación de conversión de punto flotante. Puede consultar los tipos Operand1 y Result para determinar el tipo de conversión que se intenta realizar.
Operand1
Operand2
Result
Estas _FPIEEE_VALUE estructuras indican los tipos y valores del resultado y operando propuestos. Cada estructura contiene estos campos:

OperandValid - Marca que indica si el valor de respuesta es válido.
Format - Tipo de datos del valor correspondiente. Es posible que se devuelva el tipo de formato aunque el valor correspondiente no sea válido.
Value - Valor de datos de resultado o operando.
Cause
Enable
Status
_FPIEEE_EXCEPTION_FLAGS contiene un campo de bits para cada tipo de excepción de punto flotante. Hay una correspondencia entre estos campos y los argumentos usados para enmascarar las excepciones proporcionadas a _controlfp. El significado exacto de cada bit depende de contexto:

Cause : cada bit establecido indica la excepción determinada que se generó.
Enable - Cada bit establecido indica que la excepción concreta está sin máscara.
Status - Cada bit establecido indica que la excepción determinada está actualmente pendiente, lo que incluye excepciones que no se han generado porque se enmascararon mediante _controlfp.

Las excepciones pendientes que están deshabilitadas se producen cuando se habilitan. Estas excepciones pueden dar lugar a un comportamiento indefinido cuando se usa _fpieee_flt como filtro de excepciones. _clearfp Llame siempre antes de habilitar excepciones de punto flotante.

Requisitos

Función Encabezado necesario
_fpieee_flt <fpieee.h>

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

Ejemplo

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

   }

   // ...
}

Vea también

Compatibilidad con cálculos matemáticos y el punto flotante
_control87, , _controlfp, __control87_2
_controlfp_s