_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 字段

描述

unsigned int RoundingMode, unsigned int Precision

在异常发生时,这些字段包含有关浮点环境的信息。

unsigned int Operation

指示引发陷阱操作的类型。 如果该类型是一个对比 (_FpCodeCompare),你能使用 Result.Value 字段中一个特殊 _FPIEEE_COMPARE_RESULT 值(在 pieee.h中定义)。 转换类型(_FpCodeConvert)指示陷阱发生在浮点转换操作中。 你可以查看 Operand1 和 Result 类型来决定试图要转换的类型。

_FPIEEE_VALUE Operand1, _FPIEEE_VALUE Operand2, _FPIEEE_VALUE Result

这些结构指示提议的结果和操作的类型和值为:

OperandValid  标志指示响应的值是否有效。

Format  对应的值的数据类型。 即使对应的值无效,仍可能返回布局类型。

Value  结果或操作数的数据值。

_FPIEEE_EXCEPTION_FLAGS Cause, _FPIEEE_EXCEPTION_FLAGS Enable, _FPIEEE_EXCEPTION_FLAGS Status

_FPIEEE_EXCEPTION_FLAGS 包含每个浮点异常类型的1位字段。

在这些字段和用于隐藏提供给 _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

   }

   // ...
}

.NET Framework 等效项

不适用。若要调用标准 C 函数,请使用 PInvoke。有关更多信息,请参见平台调用示例

请参见

参考

浮点支持

_control87、_controlfp、__control87_2

_controlfp_s