4.2.4. Microsoft 互換関数

以下の関数は、ARM アーキテクチャへの浮動小数点コードの移植を容易にする目的で、Microsoft 製品と互換性を持たせるために実装されています。 これらの値は float.h 内で定義されています。

_controlfp()

_controlfp 関数を使用して、次のように例外のトラップと丸めモードを制御できます。

unsigned int _controlfp(unsigned int new, unsigned int mask);

またこの関数は、マスクを使用して制御ワードを修正し、修正するビットを切り離すことができます。 mask のビットにゼロが設定されている場合、それに対応する制御ワードのビットは変更されません。 mask のビットにゼロ以外の値が設定されている場合は、それに対応する制御ワードのビットに、new の対応するビットの値が設定されます。 戻り値は、制御ワードの前の状態となります。

Note

この関数の動作は、マスクのワードにゼロを設定し、フラグのワードに 1 を設定することで切り替えられる __ieee_status (または __fp_statusの動作とは異なります。

Table 4.8 は、_controlfp への引数を作成する場合に使用できるマクロを示しています。

Table 4.8. _controlfp の引数に使用されるマクロ

マクロ説明
_MCW_EMすべての例外ビットを保持するマスクが生成されます。
_EM_INVALID無効演算例外を示すビットが生成されます。
_EM_ZERODIVIDEゼロによる除算例外を示すビットが生成されます。
_EM_OVERFLOWオーバーフロー例外を示すビットが生成されます。
_EM_UNDERFLOWアンダーフロー例外を示すビットが生成されます。
_EM_INEXACT不正確結果例外を示すビットが生成されます。
_MCW_RC丸めモードフィールドのマスクが生成されます。
_RC_CHOPゼロへの丸めを示す丸めモードの値が生成されます。
_RC_UP切り上げを示す丸めモードの値が生成されます。
_RC_DOWN切り下げを示す丸めモードの値が生成されます。
_RC_NEAR近似値への丸めを示す丸めモードの値が生成されます。

Note

これらのマクロの値は、将来の ARM 製品のバージョンにおいても同じであるという保証はありません。 将来のリリースで値が変更されてもコードが機能するように、値ではなくマクロを使用して下さい。

例えば、丸めモードを切り下げに設定するには、以下のように記述します。

_controlfp(_RC_DOWN, _MCW_RC);

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

_controlfp(_EM_INVALID, _MCW_EM);

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

_controlfp(0, _EM_INEXACT);

_clearfp()

_clearfp 関数は、5 つの例外の sticky フラグのすべてをクリアし、それらの前の値を返します。 例えば、Table 4.8 に示すマクロ _EM_INVALID_EM_ZERODIVIDE を使用して、返された結果のビットをテストできます。

_clearfp のプロトタイプを以下に示します。

unsigned _clearfp(void);

_statusfp 関数

_statusfp 関数は、例外の sticky フラグの現在の値を返します。 例えば、Table 4.8 に示すマクロ _EM_INVALID_EM_ZERODIVIDE を使用して、返された結果のビットをテストできます。

_statusfp のプロトタイプを以下に示します。

unsigned _statusfp(void);
Copyright © 2007 ARM Limited. All rights reserved.ARM DUI 0349AJ
Non-Confidential