_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)。

备注

_fpieee_flt 函数调用 IEEE 浮点异常的用户定义的陷阱处理程序并为其提供任何相关信息。此实例作为中的异常筛选器她服务框架,调用拥有 IEEE 异常处理程序,如果需要。

_FPIEEE_RECORD 结构,定义在 Fpieee.h,包含有关 IEEE 浮点异常。此机制传递到用户定义的陷阱处理程序 _fpieee_flt。

_FPIEEE_RECORD 字段

说明

unsigned int RoundingMode, unsigned int Precision

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

unsigned int Operation

指示导致该陷阱操作的类型。如果类型是比较 (_FpCodeCompare),可以提供一个特定 _FPIEEE_COMPARE_RESULT 值 (如 Fpieee.h 定义) 在 Result.Value 字段。转换类型 (_FpCodeConvert) 指示该陷阱在浮点转换运算时发生。可以回顾 Operand1 和Result 类型确定所尝试的转换的类型。

_FPIEEE_VALUE Operand1, _FPIEEE_VALUE Operand2, _FPIEEE_VALUE Operand3, _FPIEEE_VALUE Result

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

一个响应的值是否的OperandValid 标志是有效的。

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

Value 结果或多个数据值。

注意: Operand3 仅用于 Itanium 处理器家族 (IPF) (ipf) 功能。

_FPIEEE_EXCEPTION_FLAGS Cause, _FPIEEE_EXCEPTION_FLAGS Enable, _FPIEEE_EXCEPTION_FLAGS 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

   }

   // ...
}

.NET Framework 等效项

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

请参见

参考

浮点支持

_control87, _controlfp, __control87_2

_controlfp_s