Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


65153 / 76733 ←次へ | 前へ→

【16155】演算精度を吸収する方法
質問  SHO E-MAIL  - 04/7/18(日) 0:12 -

引用なし
パスワード
   計算精度を吸収させたい。

よろしくお願いします。

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 で
無限ループに陥ってしまう。)ようにしたいのですが、
この問題で、関数自体は問題なさそうなのに、頭を抱えています。

どなたか、よい解決策はないでしょうか?

2 hits

【16155】演算精度を吸収する方法 SHO 04/7/18(日) 0:12 質問
【16156】Re:演算精度を吸収する方法 IROC 04/7/18(日) 0:53 回答
【16157】Re:演算精度を吸収する方法 SHO 04/7/18(日) 1:08 お礼
【16159】Re:演算精度を吸収する方法 IROC 04/7/18(日) 1:26 回答
【16161】Re:演算精度を吸収する方法 SHO 04/7/18(日) 1:37 お礼

65153 / 76733 ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free