_fpieee_flt

为 IEEE 浮点异常调用用户定义的陷阱处理程序。

语法

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

参数

excCode
异常代码。

excInfo
指向 Windows NT 异常信息结构的指针。

handler
指向用户的 IEEE 陷阱处理程序例程的指针。

返回值

_fpieee_flt 的返回值是由 handler 返回的值。 同样的,IEEE 筛选器例程可用于结构化异常处理 (SEH) 机制的 except 子句。

备注

_fpieee_flt 函数为 IEEE 浮点异常调用用户定义的陷阱处理程序并为其提供所有相关信息。 此例程用作 SEH 机制中的异常筛选器,它会在必要时调用您的 IEEE 异常处理程序。

Fpieee.h 中定义的 _FPIEEE_RECORD 结构包含有关 IEEE 浮点异常的信息。 该结构通过 _fpieee_flt 传递到用户定义的陷阱处理程序中。

_FPIEEE_RECORD 字段 说明
RoundingMode
Precision
这些 unsigned int 字段包含发生异常时浮点环境的相关信息。
Operation unsigned int 字段指示导致陷阱的操作的类型。 如果该类型是一个比较 (_FpCodeCompare),您可以提供 Result.Value 字段中某个特殊的 _FPIEEE_COMPARE_RESULT 值(如 Fpieee.h 中所定义)。 转换类型 (_FpCodeConvert) 指示浮点转换操作期间出现了陷阱。 可以查看 Operand1Result 类型来决定要尝试的转换类型。
Operand1
Operand2
Result
这些 _FPIEEE_VALUE 结构指示建议的结果和操作数的类型和值。 每个结构都包含以下字段:

OperandValid - 指示响应值是否有效的标志。
Format - 对应值的数据类型。 可返回格式类型,即使相应的值无效。
Value - 结果或操作数的数据值。
Cause
Enable
Status
_FPIEEE_EXCEPTION_FLAGS 包含每种类型的浮点异常的位字段。 这些字段和用于屏蔽提供给 _controlfp 的异常的自变量之间存在对应关系。 每个位的确切含义取决于上下文:

Cause - 每个设置位指示已引发的特定异常。
Enable - 每个设置位指示特定异常当前已取消屏蔽。
Status - 每个设置位都指示特定异常当前处于挂起状态,其中包括因被 _controlfp 屏蔽而未引发的异常。

已禁用的挂起的异常在您启用它们之后将会引发。 这些异常在将 _fpieee_flt 用作异常筛选器时会导致未定义的行为。 在启用浮点异常之前,始终调用 _clearfp

要求

函数 必需的标头
_fpieee_flt <fpieee.h>

有关兼容性的详细信息,请参阅 兼容性

示例

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

   }

   // ...
}

另请参阅

数学和浮点支持
_control87_controlfp__control87_2
_controlfp_s