__ieee_status()

Note

ARM コンパイラツールチェーンでは、AArch64 ターゲット用の浮動小数点例外トラップはサポートされません。

ARM コンパイラツールチェインでは、浮動小数点環境のステータスワードへのインタフェースがサポートされています。 このインタフェースは、関数 __ieee_status() によって提供されます。一般的に VFP のステータスワードを変更するにはこの関数を使用するのが最も効率的です。 __ieee_status()fenv.h で定義されています。

__ieee_status() の関数プロトタイプは次のとおりです。

unsigned int __ieee_status(unsigned int mask, unsigned int flags);

Note

この関数には、例外をサポートする浮動小数点モデルが必要です。 ARM コンパイラ 6 では、これはデフォルトで有効になっています。-ffast-math などの armclang コマンドラインオプションによって無効になります。

__ieee_status() は、パラメータに基づいてステータスワードの書き込み可能部分を修正し、そのワード全体の前の値を返します。

書き込み可能ビットを変更するには、それらの値を以下のように設定します。

new = (old & ~mask) ^ flags;

対応するマスクとフラグのビットに基づき、ステータスワードの各ビットに対しては 4 つの異なる演算を実行できます。 詳細については、「Table 4」を参照して下さい。

Table 4. ステータスワードビットの修正

マスクのビットフラグのビット効果
00変更なし
01切り替え
100 を設定
111 を設定

Figure 2 は、__ieee_status() を使用したときのステータスワードのレイアウトを示しています。

Figure 2. IEEE のステータスワードのレイアウト

To view this graphic, your browser must support the SVG format. Either install a browser with native support, or install an appropriate plugin such as Adobe SVG Viewer.


Figure 2 は以下のフィールドを示しています。

__ieee_status() 呼び出しの定義に加え、fenv.h ではその引数に使用される次の定数も定義されています。

#define FE_IEEE_FLUSHZERO          (0x01000000)
#define FE_IEEE_ROUND_TONEAREST    (0x00000000)
#define FE_IEEE_ROUND_UPWARD       (0x00400000)
#define FE_IEEE_ROUND_DOWNWARD     (0x00800000)
#define FE_IEEE_ROUND_TOWARDZERO   (0x00C00000)
#define FE_IEEE_ROUND_MASK         (0x00C00000)
#define FE_IEEE_MASK_INVALID       (0x00000100)
#define FE_IEEE_MASK_DIVBYZERO     (0x00000200)
#define FE_IEEE_MASK_OVERFLOW      (0x00000400)
#define FE_IEEE_MASK_UNDERFLOW     (0x00000800)
#define FE_IEEE_MASK_INEXACT       (0x00001000)
#define FE_IEEE_MASK_ALL_EXCEPT    (0x00001F00)
#define FE_IEEE_INVALID            (0x00000001)
#define FE_IEEE_DIVBYZERO          (0x00000002)
#define FE_IEEE_OVERFLOW           (0x00000004)
#define FE_IEEE_UNDERFLOW          (0x00000008)
#define FE_IEEE_INEXACT            (0x00000010)
#define FE_IEEE_ALL_EXCEPT         (0x0000001F)

例えば、丸めモードを切り下げに設定するには、以下の呼び出しを行います。

__ieee_status(FE_IEEE_ROUND_MASK, FE_IEEE_ROUND_DOWNWARD);

無効演算例外のトラップを有効にし、他のすべての例外のトラップを無効にするには、以下のように記述します。

__ieee_status(FE_IEEE_MASK_ALL_EXCEPT, FE_IEEE_MASK_INVALID);

不正確結果例外のトラップを無効にするには、以下のように記述します。

__ieee_status(FE_IEEE_MASK_INEXACT, 0);

アンダーフロースティッキーフラグをクリアするには、以下のように記述します。

__ieee_status(FE_IEEE_UNDERFLOW, 0);

Show/hide関連項目

概念

ARM C ライブラリ、C++ ライブラリ、および浮動小数点サポートユーザガイド

タスク

ARM C ライブラリ、C++ ライブラリ、および浮動小数点サポートユーザガイド

参照
Copyright © 2014 ARM. All rights reserved.ARM DUI 0809BJ
Non-ConfidentialID121814