Excel VBA質問箱 IV

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

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


11427 / 13645 ツリー ←次へ | 前へ→

【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 お礼[未読]

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

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

【16156】Re:演算精度を吸収する方法
回答  IROC  - 04/7/18(日) 0:53 -

引用なし
パスワード
   >Double

通貨型(Currency)は使えませんか?

【16157】Re:演算精度を吸収する方法
お礼  SHO E-MAIL  - 04/7/18(日) 1:08 -

引用なし
パスワード
   ▼IROC さん:
>>Double
>
>通貨型(Currency)は使えませんか?

ほんとだ! Currency で、正しく表示されます!
あとは、この精度で大丈夫か、検証してみます。
でも、うれしい!この一週間悩みつづけていたものですから!
IROCさん、感謝感謝です。
matrix作って走らすたびに、1日数回は暴走していて、
「なんでだ!何が悪いちゅーねん!」と毒を吐いていたものですから、
落ち着いて眠れそうです。
これって、基本中の基本なんですかね。やっぱり、、
Double, Single の間で思い悩んでました。
どうもありがとうございました!

【16159】Re:演算精度を吸収する方法
回答  IROC  - 04/7/18(日) 1:26 -

引用なし
パスワード
   MSDNで調べて、これかなと思いました。
 ↓
http://support.microsoft.com/default.aspx?scid=kb;ja;409744

【16161】Re:演算精度を吸収する方法
お礼  SHO E-MAIL  - 04/7/18(日) 1:37 -

引用なし
パスワード
   ふむふむ、お勉強になりました。
誤差が許されないシステムでは、引数をCurrencyで
取っていくんですね。この記述を呼んでいると、
セルからの値の取得をこれまでずーっと variantか、
doubleでばっかり取得してきていた自分のプログラム
ちょっと恐ろしい気がします。こんなに簡単な
大小判断を間違えられてしまうんですから、、
しかし、 0.7 + 0.1 + 0.1 + 0.1 が、currency
を指定しないと 「1以上である」=false
って言われちゃうのって、ちょっと恐ろしいです
ね。素人感覚では、「誤差が許されない」レベル
とは、ちがうような気がするけどなぁ、、
ともあれ、こんなに迅速に解決できて、本当に
ありがとうございます。(夜は寝てくださいね!)

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