_status87、_statusfp、_statusfp2
更新 : 2007 年 11 月
浮動小数点のステータス ワードを取得します。
unsigned int _status87( void );
unsigned int _statusfp( void );
void _statusfp2(unsigned int *px86, unsigned int *pSSE2)
パラメータ
px86
このアドレスには、x87 浮動小数点ユニットのステータス ワードが格納されます。pSSE2
このアドレスには、SSE2 浮動小数点ユニットのステータス ワードが格納されます。
戻り値
_status87 と _statusfp の戻り値のビットは浮動小数点のステータスを示します。_status87 関数から返されるビットの定義の詳細については、FLOAT.H インクルード ファイルを参照してください。多くの数値演算ライブラリ関数では、8087/80287 ステータス ワードが変更されますが、予測できない結果になります。浮動小数点ステータス ワードの状態がわかっている範囲で実行される浮動小数点演算が少ないほど、_clear87 と _status87 の戻り値の信頼性は高くなります。_statusfp2 に戻り値はありません。
解説
_status87 関数は、浮動小数点のステータス ワードを取得します。ステータス ワードは、8087/80287/80387 ステータス ワードと、浮動小数点スタックのオーバーフローやアンダーフローなど、8087/80287/80387 例外ハンドラによって検出されるその他の条件を組み合わせたものです。ステータス ワードの内容が返される前に、マスクされていない例外が確認されます。つまり、呼び出し元に保留状態の例外が通知されます。
_statusfp は、_status87 の移植性の高いバージョンで、プラットフォームに依存しません。Intel (x86) プラットフォームでは _status87 関数と同じで、MIPS プラットフォームでもサポートされます。浮動小数点コードを MIPS に移植できるようにするには、_statusfp 関数を使用します。x86 プラットフォームだけを対象とする場合は、_status87 または _statusfp 関数のいずれかを使用します。
x87 と SSE2 の両方の浮動小数点プロセッサを使用するチップ (Pentium IV 以降など) には、_statusfp2 を推奨します。_statusfp2 のアドレスには x87 と SSE2 の両方の浮動小数点プロセッサの浮動小数点ステータス ワードが格納されます。x87 と SSE2 の浮動小数点プロセッサをサポートするチップを使用すると、_statusfp または _controlfp のいずれかが使用され、x87 または SSE2 の浮動小数点ステータス ワードを参照できるために動作があいまいになり、EM_AMBIGUOUS が 1 に設定されます。
共通言語ランタイムは浮動小数点の既定の精度のみをサポートするので、/clr (共通言語ランタイムのコンパイル) または /clr:pure を使用してコンパイルする場合、これらの関数は使用しないでください。
必要条件
ルーチン |
必須ヘッダー |
---|---|
_status87, _statusfp, _statusfp2 |
<float.h> |
互換性の詳細については、「C ランタイム ライブラリ」の「互換性」を参照してください。
使用例
// crt_status87.c
// This program creates various floating-point errors and
// then uses _status87 to display messages indicating these problems.
// Compile this program with optimizations disabled (/Od). Otherwise,
// the optimizer removes the code related to the unused floating-
// point values.
//
#include <stdio.h>
#include <float.h>
int main( void )
{
double a = 1e-40, b;
float x, y;
printf( "Status = %.4x - clear\n",_status87() );
// Assignment into y is inexact & underflows:
y = a;
printf( "Status = %.4x - inexact, underflow\n", _status87() );
// y is denormal:
b = y;
printf( "Status = %.4x - inexact underflow, denormal\n",
_status87() );
// Clear user 8087:
_clear87();
}
Status = 0000 - clear
Status = 0003 - inexact, underflow
Status = 80003 - inexact underflow, denormal
.NET Framework の相当するアイテム
適用できません。標準 C 関数を呼び出すには、PInvoke を使用します。詳細については、「プラットフォーム呼び出しの例」を参照してください。