丸め制御
丸めには、直近値への丸め、切り上げ、切り下げ、切捨てがあり、値の操作や演算で、真の値よりも精度が下がる時(仮数部の一部が切り捨てられる時)に適用されます。通常は、直近値への丸めをデフォルトとして設定します。
floatex.dll の多くの関数は、丸め制御の影響を受けます。影響範囲が広い場合は、必要な時だけ設定を変更するようにしてください。
例.丸めモードのみ変更する
unsigned int set_roundcontrol(unsigned int rc)
{
unsigned int cw;
cw = floatex_storecw();
floatex_loadcw((cw & ~(unsigned int)FEX_MCW_RC) | rc);
return cw & (unsigned int)FEX_MCW_RC; /* 変更前の丸めモードを返す */
}
デフォルトの設定を FEX_RC_NEAR にしておき、変更する部分で上記の関数を呼び出します。
例えば、FLOATEX 型の値で小数点以下の切捨て(真の切捨て)を行う場合、
unsigned int default_rc;
default_rc = set_roundcontrol(FEX_RC_CHOP);
floatex_eint(psrc , pdest );
set_roundcontrol(default_rc);
long 型に変換する floatex_tolong を実行する時にも、丸めは行われます。
値の切り上げ.
unsigned int default_rc;
default_rc = set_roundcontrol(FEX_RC_UP);
ldest = floatex_tolong(psrc);
set_roundcontrol(default_rc);
同系の関数でも、丸め制御が固定のものがあるので注意が必要です。例えば、unsigned long 型に変換する floatex_toulong は、切捨てで固定です(unsigned 系と、結果を飽和させる関数は切捨て)。
|