_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。有关更多信息,请参见平台调用示例。