Linux上で丸めの制御をする方法を以上で示したが、そこではアセンブラ を用いていた。これを利用しよう.次の内容の 関数をup.cというファイルに保存したとしよう。
#include <fpu_control.h>
int _RoundUp = _FPU_RC_UP|_FPU_DEFAULT);
void up(void)
{
asm volatile("fldcw _RoundUp");
}ここで、Cコンパイラでオブジェクトファイルup.oを次のようにして作る。これ は上への丸めの関数である。
$ cc -c up.c同様にして、次の内容のファイルをdown.cとする。
#include <fpu_control.h>
int _RoundDown = _FPU_RC_DOWN|_FPU_DEFAULT);
void down(void)
{
asm volatile("fldcw _RoundDown");
}ここで、Cコンパイラでオブジェクトファイルdown.oを次のようにして作る。こ れは下への丸めの関数である。
$ cc -c down.cさらに、次の内容のファイルをnear.cとする。
#include <fpu_control.h>
int _RoundNear = _FPU_RC_NEAREST|_FPU_DEFAULT);
void near(void)
{
asm volatile("fldcw _RoundNear");
}ここで、Cコンパイラでオブジェクトファイルnear.oを次のようにして作る。こ れは最近点への丸めの関数である。
$ cc -c near.c以上の準備の下に、Scilabを起動する。
$ scilabそして、次のようにして、C言語の関数のオブジェクトファイルをScilab内で 利用できるようにリンクする。
-->link('up.o','up','C');
linking files up.o to create a shared executable
shared archive loaded
Linking up (in fact up)
Link done
-->link('down.o','down','C');
linking files down.o to create a shared executable
shared archive loaded
Linking down (in fact down)
Link done
-->a=1;
-->b=10;
-->call('up');
-->c=a/b;
-->printf("%25.20lg\n",c)
0.1000000000000000056
-->call('down');
-->c=a/b;
-->printf("%25.20lg\n",c)
0.099999999999999991673