|
計算精度を吸収させたい。
よろしくお願いします。
2つの引数を比較し、どっちが大きいかを出力する関数を作りたいと
思っています。関数名を bigsmall(value1,value2)とします。
以下のように書いてみました。
Function bigsmall(Value1 As Double, Value2 As Double)
If Value1 >= Value2 Then
bigsmall = "value1が大きいか等しい"
Else
bigsmall = "value1が小さい"
End If
End Function
使用しているのは、Excell 2000 を XP Pro 上で動かしています。
B3 に 1 (これが value1)
C2 に 1 (これが value2)
C3 に =bigsmall(b3,c2) という式を入れると、
B C
------------+---------------
2 | 1
3 | 1 =bigsmall(b3,c2)
C3 には、 "value1が大きいか等しい" と正しく表示されます。
今度は、
B3 に 0.7
B4〜B6に、直上のセル+0.1 の式
C2 に 1
C6 に =bigsmall(b6,c2) という式を入れます。
B C
------------+---------------
2 | 1
3 | 0.7
4 | =B3+0.1
5 | =B4+0.1
6 | =B5+0.1 =bigsmall(b6,c2)
B6の値は 1 ですから、上と同じ結果を返すはずですが、
C6には、 "value1が小さい" と表示されます。
調べてみると、B6-C2の値は、 -1E-16 となっていて、
どうやら上のたった、0.1を3回足し算しただけで、精度の問題がでていて
判定を間違うようです。
引数の精度を single にしようが、doubleにしようが、B6から数値を
拾った段階でもうおしまい、、って感じ。
実は待ち行列理論で用いる、ある収束する関数を製作していて、
引数 a,b が、a >= b になる場合には、処理を中断させ、-1を返す。
それ以外の場合には、収束値を求める(ご想像に難くなく、a >=b で
無限ループに陥ってしまう。)ようにしたいのですが、
この問題で、関数自体は問題なさそうなのに、頭を抱えています。
どなたか、よい解決策はないでしょうか?
|
|