| |||
Home > 浮動小数点のサポート > _controlfp() |
ARM コンパイラツールチェーンでは、AArch64 ターゲット用の浮動小数点例外トラップはサポートされません。
float.h
で定義されるこの関数は、Microsoft 製品との互換性を維持するために提供されています。
この関数を使用して、例外のトラップと丸めモードを制御できます。
_controlfp()
の関数プロトタイプは次のとおりです。
unsigned int _controlfp(unsigned int new, unsigned int mask);
この関数には、例外をサポートする浮動小数点モデルが必要です。 ARM コンパイラ 6 では、これはデフォルトで有効になっています。-ffast-math
などの armclang コマンドラインオプションによって無効になります。
また、_controlfp()
は、マスクを使用して制御ワードを修正し、修正するビットを切り離すことができます。 mask
のビットにゼロが設定されている場合、それに対応する制御ワードのビットは変更されません。 mask
のビットにゼロ以外の値が設定されている場合は、それに対応する制御ワードのビットに、new
の対応するビットの値が設定されます。
戻り値は、制御ワードの前の状態となります。
これは、マスクのワードにゼロを設定し、フラグのワードに 1 を設定することでビットを切り替えられる、__ieee_status()
または __fp_status()
の動作とは異なります。
Table 3 は、_controlfp()
への引数を作成する場合に使用できるマクロを示しています。
Table 3. _controlfp の引数に使用されるマクロ
マクロ | 説明 |
---|---|
_MCW_EM | すべての例外ビットを保持するマスクが生成されます。 |
_EM_INVALID | 無効演算例外を示すビットが生成されます。 |
_EM_ZERODIVIDE | ゼロによる除算例外を示すビットが生成されます。 |
_EM_OVERFLOW | オーバーフロー例外を示すビットが生成されます。 |
_EM_UNDERFLOW | アンダーフロー例外を示すビットが生成されます。 |
_EM_INEXACT | 不正確結果例外を示すビットが生成されます。 |
_MCW_RC | 丸めモードフィールドのマスクが生成されます。 |
_RC_CHOP | ゼロへの丸めを示す丸めモードの値が生成されます。 |
_RC_UP | 切り上げを示す丸めモードの値が生成されます。 |
_RC_DOWN | 切り下げを示す丸めモードの値が生成されます。 |
_RC_NEAR | 近似値への丸めを示す丸めモードの値が生成されます。 |
これらのマクロの値は、将来の ARM 製品のバージョンにおいても同じであるという保証はありません。 将来のリリースで値が変更されてもコードが機能するように、値ではなくマクロを使用して下さい。
例えば、丸めモードを切り下げに設定するには、以下の関数を呼び出します。
_controlfp(_RC_DOWN, _MCW_RC);
無効演算例外のトラップを有効にし、他のすべての例外のトラップを無効にするには、以下のように記述します。
_controlfp(_EM_INVALID, _MCW_EM);
不正確結果例外のトラップを無効にするには、以下のように記述します。
_controlfp(0, _EM_INEXACT);
ARM C ライブラリ、C++ ライブラリ、および浮動小数点サポートユーザガイド: