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