_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 浮點例外狀況的使用者定義的設陷處理常式,並提供所有相關資訊。此常式會當做在 SEH 機制,這會叫用您自己的 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) 函式。 |
_FPIEEE_EXCEPTION_FLAGS Cause, _FPIEEE_EXCEPTION_FLAGS Enable, _FPIEEE_EXCEPTION_FLAGS Status |
_FPIEEE_EXCEPTION_FLAGS 包含一個位元欄位,每一種類型的浮點例外。 這些欄位,並加上遮罩提供給例外狀況所用的引數之間的對應關係 _controlfp。 每個位元的確切的意義視內容而定: Cause每一組位元表示所引發的特定例外狀況。 Enable每一組位元表示特定的例外狀況是目前的遮罩。 Status每一組位元表示特定的例外狀況是目前擱置中。這包括了不被升級,因為它們已加上遮罩的例外狀況_controlfp。 |
擱置中的已停用的例外狀況時,會引發您啟用它們。這可能會導致未定義的行為時使用_fpieee_flt 為例外狀況篩選條件。請務必呼叫 _clearfp ,才能啟用浮點例外。
需求
Function |
所需的標頭 |
---|---|
_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。 如需詳細資訊,請參閱平台叫用範例。