Document

丸めモードの変更

丸めモードの変更

ここでは、浮動小数点演算の丸めモードの変更について書きます。
環境によっていろいろ違うかもしれませんが その辺は、自力でがんばってください。
ぶっちゃけ、相当マニアックな状況だと思いますが。

当方の環境

RHEL 2.6.18(x64) gcc (GCC) 4.1.2
Xeon W3520

サンプルコード

round.c
round.h
test.c

サンプルコードの使い方

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");//いじったフラグを書き込みます

こちらも、その他詳しくは、サンプルコードを見てチェックして下さい。