● 関数リファレンス
コントロールワード値の設定
void __stdcall floatex_loadcw(unsigned int newcw);
引数
戻り値
無し
説明
新しいコントロールワード値を設定します。
次の値を単独、または OR 接合で指定します。
- 割り込み例外マスク
値 | 意味 |
FEX_EM_INVALID | 無効操作 |
FEX_EM_DENORMAL | デノーマル・オペランド |
FEX_EM_ZERODIVIDE | ゼロ除算 |
FEX_EM_OVERFLOW | オーバーフロー |
FEX_EM_UNDERFLOW | アンダーフロー |
FEX_EM_INEXACT | 不正確結果(精度) |
禁止する割り込みを設定します。
- 丸め制御
値 | 意味 |
FEX_RC_CHOP | ゼロ方向への丸め(真の切捨て) |
FEX_RC_UP | 切り上げ(+∞の方向) |
FEX_RC_DOWN | 切り捨て(-∞の方向) |
FEX_RC_NEAR | 直近値への丸め(偶数) |
- 精度制御(仮数部のビット数)
値 | 意味 |
FEX_PC_24 | 24bit |
FEX_PC_53 | 53bit |
FEX_PC_64 | 64bit |
floatex.dll を使用する際は FEX_PC_64 を選択してください。
_control87 、_controlfp 、_controlfp_s(Microsoft C/C++の場合)と同じような設定を行う場合は、次の計算結果を指定します。
(oldcw & ~mask) | (newcw & mask)
oldcw は floatex_storecw で得られます。
mask には次の値を単独、または OR 接合で指定します。
値 | 意味 |
FEX_MCW_EM | 割り込み例外 |
FEX_MCW_RC | 丸め制御 |
FEX_MCW_PC | 精度制御 |
これらの値は、各項目の値全てを OR 接合した値と同じです。
例えば、FEX_MCW_EM は、
FEX_EM_INVALID | FEX_EM_DENORMAL | FEX_EM_ZERODIVIDE | FEX_EM_OVERFLOW |
FEX_EM_UNDERFLOW | FEX_EM_INEXACT
と同じです。
割り込み例外についてはマスク設定なので、値をセットすると対象の例外が無効になります。指定の値だけ例外を有効にする場合は、次の値を設定します。
FEX_MCW_EM ^ (有効にする例外1 | 有効にする例外2 | ...)
FPU_CONTROL 構造体
次の構造体を使用して設定する事もできます。
(FPU_CONTROL 構造体)
typedef struct {
unsigned int invalid : 1;
unsigned int denormal : 1;
unsigned int zerodivide : 1;
unsigned int overflow : 1;
unsigned int underflow : 1;
unsigned int inexact : 1;
unsigned int reserved1 : 2;
unsigned int precision : 2;
unsigned int rounding : 2;
unsigned int infinity : 1;
unsigned int reserved2 : 3;
} FPU_CONTROL,*PFPU_CONTROL;
この構造体は floatex.h 内で定義されています。
メンバ名 | 意味 |
invalid | 無効操作例外マスク(IM) |
denormal | デノーマル・オペランド例外マスク(DM) |
zerodivide | ゼロ除算例外マスク(ZM) |
overflow | オーバーフロー例外マスク(OM) |
underflow | アンダーフロー例外マスク(UM) |
inexact | 不正確結果例外マスク(PM) |
reserved1 | 予約 |
precision | 精度制御(PC) |
rounding | 丸め制御(RC) |
infinity | 無限制御(X) |
reserved2 | 予約 |
変換には、次の共用体を使用する事もできます。この共用体は floatex.h 内で定義されています。
typedef union {
unsigned int dword;
FPU_CONTROL bits;
} FPU_CONTROL_DW,*PFPU_CONTROL_DW;