次の方法で共有


_status87_statusfp_statusfp2

浮動小数点ステータス ワードを取得します。

構文

unsigned int _status87( void );
unsigned int _statusfp( void );
void _statusfp2(unsigned int *px86, unsigned int *pSSE2)

パラメーター

px86
このアドレスには、x87 浮動小数点ユニットのステータス ワードが格納されます。

pSSE2
このアドレスには、SSE2 浮動小数点ユニットのステータス ワードが格納されます。

戻り値

_status87 および _statusfp の戻り値のビットは浮動小数点のステータスを示します。 _statusfp から返されるビットの定義の詳細については、FLOAT.H インクルード ファイルを参照してください。 多くの数値演算ライブラリ関数は、予測できない結果を使用して浮動小数点ステータス ワードを変更します。 最適化では、_status87_statusfp、および関連する関数の呼び出しの周囲の浮動小数点演算を順序変更、結合、および除去できます。 浮動小数点演算を並べ替える最適化を防ぐには、 /Od (Disable (Debug)) コンパイラ オプションまたは fenv_access pragma ディレクティブを使用します。 浮動小数点ステータス ワードの既知の状態間で浮動小数点演算がほとんど実行されていない場合は、_clearfp および _statusfp からの戻り値と、_statusfp2 の戻り値パラメーターの信頼性が高くなります。

解説

_statusfp 関数は浮動小数点ステータス ワードを取得します。 ステータス ワードとは、浮動小数点例外によって検出された浮動小数点プロセッサのステータスやその他の条件 (浮動小数点スタック オーバーフローおよびアンダーフローなど) の組み合わせです。 マスクされていない例外は、ステータス ワードのコンテンツが返される前にチェックされます。 つまり、呼び出し元には保留中の例外が通知されます。 x86 プラットフォームでは、_statusfp は x87 と SSE2 浮動小数点のステータスの組み合わせを返します。 x64 プラットフォームでは、返される状態は SSE の MXCSR 状態に基づいています。 ARM64 プラットフォームでは、 _statusfp は FPSCR レジスタから状態を返します。

_statusfp は、_status87 の移植性の高いバージョンで、プラットフォームに依存しません。 Intel (x86) プラットフォームの _status87 と同じであり、x64 および ARM64 プラットフォームでもサポートされています。 浮動小数点コードをすべてのアーキテクチャに確実に移植するには、_statusfp を使用します。 x86 プラットフォームのみを対象としている場合は、 _status87 または _statusfpを使用できます。

x87 および SSE2 浮動小数点プロセッサの両方を持つチップ (Pentium IV など) には _statusfp2 をお勧めします。 _statusfp2 の場合、アドレスは x87 または SSE2 浮動小数点プロセッサの両方に対して浮動小数点ステータス ワードを使用して入力されます。 x87 浮動小数点プロセッサと SSE2 浮動小数点プロセッサをサポートするチップの場合、_statusfpまたは_controlfpが使用され、x87 または SSE2 浮動小数点ステータス ワードを参照する可能性があるため、アクションがあいまいな場合、EM_AMBIGUOUSは 1 に設定されます。 _statusfp2 関数は、x86 プラットフォームでのみサポートされます。

共通言語ランタイム (CLR) では既定の浮動小数点精度のみがサポートされるため、これらの関数は /clr (共通言語ランタイム コンパイル) には役立ちません。

要件

ルーチンによって返される値 必須ヘッダー
_status87_statusfp_statusfp2 <float.h>

互換性の詳細については、「 Compatibility」を参照してください。

// crt_statusfp.c
// Build by using: cl /W4 /Ox /nologo crt_statusfp.c
// This program creates various floating-point errors and
// then uses _statusfp to display messages that indicate these problems.

#include <stdio.h>
#include <float.h>
#pragma fenv_access(on)

double test( void )
{
   double a = 1e-40;
   float b;
   double c;

   printf("Status = 0x%.8x - clear\n", _statusfp());

   // Assignment into b is inexact & underflows:
   b = (float)(a + 1e-40);
   printf("Status = 0x%.8x - inexact, underflow\n", _statusfp());

   // c is denormal:
   c = b / 2.0;
   printf("Status = 0x%.8x - inexact, underflow, denormal\n",
            _statusfp());

   // Clear floating point status:
   _clearfp();
   return c;
}

int main(void)
{
   return (int)test();
}
Status = 0x00000000 - clear
Status = 0x00000003 - inexact, underflow
Status = 0x00080003 - inexact, underflow, denormal

関連項目

数値演算と浮動小数点のサポート
_clear87, _clearfp
_control87_controlfp__control87_2