次の方法で共有


_fpieee_flt

更新 : 2007 年 11 月

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: structured exception-handling) 機構の例外句で使用できます。

解説

_fpieee_flt 関数は、IEEE 浮動小数点例外用のユーザー定義トラップ ハンドラを呼び出し、関連情報をすべてハンドラに提供します。このルーチンは SEH 機構の中で例外フィルタとして機能し、必要に応じてユーザー定義の IEEE 例外ハンドラを呼び出します。

Fpieee.h で定義されている _FPIEEE_RECORD 構造体には、IEEE 浮動小数点例外に関する情報が含まれています。この構造体は _fpieee_flt によってユーザー定義のトラップ ハンドラに渡されます。

_FPIEEE_RECORD フィールド

説明

unsigned int RoundingMode, unsigned int Precision

これらのフィールドには、例外発生時の浮動小数点環境に関する情報が含まれています。

unsigned int Operation

トラップの原因となった演算の種類を示します。比較 (_FpCodeCompare) の場合は、Result.Value フィールドに、Fpieee.h で定義されている専用の _FPIEEE_COMPARE_RESULT 値のいずれかを指定できます。変換 (_FpCodeConvert) の場合は、浮動小数点の変換時にトラップが発生したことを示します。Operand1 と Result の種類を確認すると、実行される変換の種類がわかります。

_FPIEEE_VALUE Operand1, _FPIEEE_VALUE Operand2, _FPIEEE_VALUE Operand3, _FPIEEE_VALUE Result

これらの構造体は、提示される結果とオペランドの種類と値を示します。

OperandValid   応答値が有効かどうかを示すフラグ。

Format   対応する値のデータ型。対応する値が有効でない場合も、データ型が返される場合があります。

Value   結果またはオペランドのデータ値

メモ: Operand3 は、IPF (Itanium Processor Family) の関数のみで使用します。

_FPIEEE_EXCEPTION_FLAGS Cause, _FPIEEE_EXCEPTION_FLAGS Enable, _FPIEEE_EXCEPTION_FLAGS Status

_FPIEEE_EXCEPTION_FLAGS では、浮動小数点例外の各種類に 1 ビットのフィールドが対応しています。

これらのフィールドは、_controlfp に指定される例外をマスクするための引数と対応しています。

各ビットの正確な意味は、コンテキストに依存します。

Cause   設定された各ビットは、発生した特定の例外を示します。

Enable   設定された各ビットは、特定の例外が現在マスクされていないことを示します。

Status   設定された各ビットは、特定の例外が現在保留状態であることを示します。この例外には、_controlfp によってマスクされなかったために発生していない例外も含まれます。

無効になっている保留状態の例外は、有効にしたときに発生します。これによって、_fpieee_flt を例外フィルタとして使用したときに、未定義の動作が実行される場合があります。常に _clearfp を呼び出してから、浮動小数点例外を有効にしてください。

必要条件

関数

必須ヘッダー

_fpieee_flt

<fpieee.h>

互換性の詳細については、「C ランタイム ライブラリ」の「互換性」を参照してください。

使用例

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