共用方式為


_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 Result

這些結構表示提出結果和運算元的型別和值:

OperandValid   旗標表示回應的值是否有效。

Format   對應於的值的資料型別。 格式類型可能會回傳,即使對應的值無效。

Value   結果或運算元資料值。

_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>

如需更多關於相容性的資訊,請參閱入門介紹中的 相容性 (Compatibility)

範例

// 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。如需詳細資訊,請參閱平台叫用範例

請參閱

參考

浮點支援

_control87、_controlfp、__control87_2

_controlfp_s