_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 を使用します。詳細については、「プラットフォーム呼び出しの例」を参照してください。