FORMAT関数での誤差?


ハナクソース  2004-02-03 11:35:40  No: 111648  IP: [192.*.*.*]

以下のロジックをVB4とVB6で実行した際に平均値WK_STR3に差異が出ます


Dim WK_STR As String
Dim WK_STR2 As String
Dim WK_STR3 As String

WK_STR=Text1
WK_STR=Text2

WK_STR3 = Format((((Val(WK_STR2) + Val(WK_STR) * 1000) / 2) / 1000), "#0.000")


具体的には、値A(Text1),B(Text2)に7.955と7.954を入力すると
VB4ではWK_STR3  =  7.954
VB6ではWK_STR3  =  7.955      となります。

小数点第3位が切り捨て?されているようなのですが、
差異が出ない値もあるのです。

例えば、値A(Text1),B(Text2)に2.955と2.954を入力すると
VB4、VB6ともにWK_STR3は2.955で差異は出ません。

FORMAT関数のバグなのでしょうか??
どなたか分かる方お願いします。

編集 削除
いちゆ  2004-02-03 14:36:36  No: 111649  IP: [192.*.*.*]

今実行環境がないからわからないけど、数値表現じゃなくて数値演算の誤差じゃない?

あと、式で、
>Format(
         (
           (
             (
               Val(WK_STR2) + Val(WK_STR) * 1000
             ) / 2
           ) / 1000
         ), "#0.000"
       )
ってなってるんだけど…これでいいの?

編集 削除
魔界の仮面弁士  2004-02-03 19:23:46  No: 111650  IP: [192.*.*.*]

> WK_STR=Text1
> WK_STR=Text2
……同じ変数に代入されちゃってますけれども。(^_^;)

で。そもそも Format 関数 (VarFormatNumber APIも含む)は、丸めを目的とした関数ではありません。
oleaut32.DLLのバージョンによって、結果が変わる事もありますし。
http://support.microsoft.com/default.aspx?scid=kb;ja;418691

『厳密な』丸め調整が必要なのであれば、切上げ/切捨て/四捨五入などはFormat関数以外の方法で行うようにして下さい。

また、浮動小数点演算の仕様による誤差も考慮してください。
浮動小数点型による演算を行う場合、数式の最適化処理などが原因で、
コンパイルモード(P-Code/ネイティブ)によって、差が生じる事もあります。
http://homepage3.nifty.com/salv/hp-old/03pc/qvb/03vbpg005.htm

編集 削除