丸めモードの変更
ここでは、浮動小数点演算の丸めモードの変更について書きます。
環境によっていろいろ違うかもしれませんが
その辺は、自力でがんばってください。
ぶっちゃけ、相当マニアックな状況だと思いますが。
当方の環境
RHEL 2.6.18(x64) gcc (GCC) 4.1.2
Xeon W3520
サンプルコード
サンプルコードの使い方
FPUを使う場合とSSEを使う場合でコードが異なります。
FPUの場合は、round.cの#if 1を#if 0に修正してください。
Near(); //最近接点への丸め(デフォルト)
Up();//上方向への丸め
Down();//下方向への丸め
Chop();//切り捨て
と呼び出すことで丸めモード変更ができます。
詳しい使い方はtest.cを見てください
FPUを用いる場合
x87FPUを用いる場合は、gccの場合は、fpu_control.hというファイルが存在するはずです。
これを利用すればOKです。
_FPU_SETCW(fpu_control_t);というマクロが定義されており
ここでFPUのフラグレジスタを投げればよいわけです。
たとえば、
fpu_control_t cwnear = _FPU_RC_NEAREST | _FPU_IEEE;
としておいて、
_FPU_SETCW(cwnear);
とすれば、丸めモードが最近点への丸め(偶数丸め)になります。
その他詳しくは、サンプルコードを見てチェックして下さい。
SSEを用いる場合
SSEを用いる場合は、インラインアセンブラでレジスタを設定します
asm volatile ("stmxcsr reg");//のようにして現在のフラグを取ってきて
reg&=0xffff9fdf;//これでリセットします
reg|=0x00000000;//最近接点の場合は不要ですが一応
asm volatile ("ldmxcsr reg");//いじったフラグを書き込みます
こちらも、その他詳しくは、サンプルコードを見てチェックして下さい。