Редактиране

Споделяне чрез


_fpieee_flt

Invokes a user-defined trap handler for IEEE floating-point exceptions.

Syntax

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

Parameters

excCode
Exception code.

excInfo
Pointer to the Windows NT exception information structure.

handler
Pointer to the user's IEEE trap-handler routine.

Return value

The return value of _fpieee_flt is the value returned by handler. As such, the IEEE filter routine might be used in the except clause of a structured exception-handling (SEH) mechanism.

Remarks

The _fpieee_flt function invokes a user-defined trap handler for IEEE floating-point exceptions and provides it with all relevant information. This routine serves as an exception filter in the SEH mechanism, which invokes your own IEEE exception handler when necessary.

The _FPIEEE_RECORD structure, defined in Fpieee.h, contains information pertaining to an IEEE floating-point exception. This structure is passed to the user-defined trap handler by _fpieee_flt.

_FPIEEE_RECORD field Description
RoundingMode
Precision
These unsigned int fields contain information about the floating-point environment at the time the exception occurred.
Operation This unsigned int field indicates the type of operation that caused the trap. If the type is a comparison (_FpCodeCompare), you can supply one of the special _FPIEEE_COMPARE_RESULT values (as defined in Fpieee.h) in the Result.Value field. The conversion type (_FpCodeConvert) indicates that the trap occurred during a floating-point conversion operation. You can look at the Operand1 and Result types to determine the type of conversion being attempted.
Operand1
Operand2
Result
These _FPIEEE_VALUE structures indicate the types and values of the proposed result and operands. Each structure contains these fields:

OperandValid - Flag indicating whether the responding value is valid.
Format - Data type of the corresponding value. The format type might be returned even if the corresponding value isn't valid.
Value - Result or operand data value.
Cause
Enable
Status
_FPIEEE_EXCEPTION_FLAGS contains a bit field for each type of floating point exception. There's a correspondence between these fields and the arguments used to mask the exceptions supplied to _controlfp. The exact meaning of each bit depends on context:

Cause - Each set bit indicates the particular exception that was raised.
Enable - Each set bit indicates that the particular exception is currently unmasked.
Status - Each set bit indicates that the particular exception is currently pending, which includes exceptions that haven't been raised because they were masked by _controlfp.

Pending exceptions that are disabled are raised when you enable them. These exceptions can result in undefined behavior when using _fpieee_flt as an exception filter. Always call _clearfp before enabling floating point exceptions.

Requirements

Function Required header
_fpieee_flt <fpieee.h>

For more compatibility information, see Compatibility.

Example

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

   }

   // ...
}

See also

Math and floating-point support
_control87, _controlfp, __control87_2
_controlfp_s