教科書で示した丸めの向きの制御の方法は,多数回丸めのモードを切り替えることは想定していない。アセンブラを用いた高速な方法を示す。
ここで示す方法はアセンブラをよびだすため,ポータブルでないが高速である。
Nearで0捨1入の丸め
Downで下への丸め
Upで上への丸め
Chopで絶対値が小さいものの中で,その実数に一番近い浮動小数点数への丸め
を表す。
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();
とすればそれぞれの丸めができる。
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”) |
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)) |
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”) |