_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 ) 表示設陷發生在浮點轉換作業期間。 您可以查看 Operand1 和 Result 類型,以判斷正在嘗試之轉換的類型。 |
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
}
// ...
}