教科書で示した丸めの向きの制御の方法は,多数回丸めのモードを切り替えることは想定していない。アセンブラを用いた高速な方法を示す。

IEEE754に従う倍精度浮動小数点数の丸めのモードの切り替えの命令の一覧表を示す。

ここで示す方法はアセンブラをよびだすため,ポータブルでないが高速である。

Near01入の丸め

Downで下への丸め

Upで上への丸め

Chopで絶対値が小さいものの中で,その実数に一番近い浮動小数点数への丸め

を表す。

LINUXFreeBSD 3.x gcc

Cプログラム中にグローバル変数として

int   _RoundNear   =0x133a;

int   _RoundDown   =0x173a;

int   _RoundUp     =0x1b3a;

int   _RoundChop   =0x1f3a;

と宣言しておく。すると,次の表によって丸めの制御ができる。

Near

asm volatile (“fldcw _RoundNear”)

Down

asm volatile (“fldcw _RoundDown”)

Up

asm volatile (“fldcw _RoundUp”)

Chop

asm volatile (“fldcw _RoundChop”)

実際には,プログラムの冒頭で

#define Near()   asm volatile (“fldcw _RoundNear”)

#define Down()   asm volatile (“fldcw _RoundDown”)

#define Up()     asm volatile (“fldcw _RoundUp”)

#define Chop()   asm volatile (“fldcw _RoundChop”)

と宣言しておき,プログラム中で

Near();

Down();

Up();

Chop();

とすればそれぞれの丸めができる。

FreeBSD 2.x gcc

Cプログラム中にグローバル変数として

int   _RoundNear   =x133a;

int   _RoundDown   =x173a;

int   _RoundUp     =x1b3a;

int   _RoundChop   =x1f3a;

と宣言しておく。すると,次の表によって丸めの制御ができる。

Near

asm volatile (“fldcw __RoundNear”)

Down

asm volatile (“fldcw __RoundDown”)

Up

asm volatile (“fldcw __RoundUp”)

Chop

asm volatile (“fldcw __RoundChop”)

SUN Sparc gcc

Cプログラム中にグローバル変数として

int   _RoundNear   =0x00000000L;

int   _RoundDown   =0xc0000000L;

int   _RoundUp     =0x80000000L;

int   _RoundChop   =0x40000000L;

と宣言しておく。すると,次の表によって丸めの制御ができる。

Near

asm volatile (“ld %0,%%fsr”: :”g” (_RoundNear))

Down

asm volatile (“ld %0,%%fsr”: :”g” (_RoundDown))

Up

asm volatile (“ld %0,%%fsr”: :”g” (_RoundUp))

Chop

asm volatile (“ld %0,%%fsr”: :”g” (_RoundChop))

Window98 GNU-WIN32

Cプログラム中にグローバル変数として

int   _RoundNear   =0x133a;

int   _RoundDown   =0x173a;

int   _RoundUp     =0x1b3a;

int   _RoundChop   =0x1f3a;

と宣言しておく。すると,次の表によって丸めの制御ができる。

Near

asm volatile (“fldcw __RoundNear”)

Down

asm volatile (“fldcw __RoundDown”)

Up

asm volatile (“fldcw __RoundUp”)

Chop

asm volatile (“fldcw __RoundChop”)

本文に戻る