_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 によって返される値です。 そのため、構造化例外処理 (SEH) 機構の except 句で IEEE フィルター ルーチンが使用される場合があります。

解説

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

互換性の詳細については、「 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

   }

   // ...
}

関連項目

数値演算と浮動小数点のサポート
_control87_controlfp__control87_2
_controlfp_s