Next: ノルム Up: 線形方程式の数値解はどこまで正しいか Previous: 線形方程式の数値解はどこまで正しいか

 

Scilabにおける丸めの方向の指定

ScilabはFortranやCで書かれた関数を呼び出して、実行する機能がある。これを リンクという。ここでは、C言語とのリンクについて議論する。以上で述べたよ うに、精度保証付き 数値計算を行うためには、IEEE754規格を利用して、浮動小数点数演算の 丸めの方向を制御する必要がある。そこで、C言語による浮動小数点数演算の丸 めの制御のための関数を利用して、Scilab上で浮動小数点数の丸めの制御を 行う方法をリンクの例として示そう。

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


s oishi
2000-05-04