1.4 誤差を含めた判断

計算機内部で実数値は近似的に扱われるため, どうしても誤差を含んでしまう. 例えば,

      LOGICAL LEQ
      X = 1.
      Y = X/3.
      LEQ = X .EQ. (Y*3.)

というプログラムではleq.true.にならない. しかし, もともとxyは近似値なのであるから, それらを比較するときも近似的に比較するのが合理的であり, 実際そのような比較をしたい場合も多い. すなわち, xy*3.が正確に一致するかどうかではなく, 近似的に一致するかどうか調べたい場合も多い.

そのような場合のために, LRLLIB が用意されている. 例えば,

      LOGICAL LEQ, lreq

      X = 1.
      Y = X/3.
      NumRu::DCL.gllset(cp,lpara)
      LEQ = return_value = NumRu::DCL.lreq(x,y)

とすると, 近似的な比較が可能になる. lreq は LRLLIBのメソッド(元関数)で, 2つの値が計算機の精度内で近似的に一致するかどうか調べるものである. ここでいう計算機の精度とは glpget/glpsetの管理する内部変数'REPSL''RFACT'をかけた値である. 'REPSL'には, 実際の実数の内部表現の精度に安全率として10倍をかけた値が設定されており, 'RFACT'には初期値として1が設定されている. 'REPSL'はライブラリのインストール時に決るもので, この値をプログラムの中で変更することはできないが, 計算精度が悪くて, この値よりもラフな比較をしたい時には, 内部変数 'RFACT'に1以上の数値を指定すればよい.

LRLLIBだけでなく, MATH1のいくつかのサブパッケージには同様の機能がある.