分享方式:


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

   }

   // ...
}

另請參閱

數學與浮點支援
_control87、 、 _controlfp__control87_2
_controlfp_s