実数の誤差の問題

解決


山本  2007-08-08 17:30:25  No: 137108

実数の誤差の問題  (VB6  WINXP)

お世話になります。

あるサイト(下記)に、
    Debug.Print Int(0.1234 * 10000)
は 1233 と表示されると書いてあったのですが、確かにそうなったのですが、どうも理解できずに悩んでいます。
そのサイトには、
「0.1234*10000の計算は、誤差のために1234よりも少し小さな値になります。そのため、2つめでは Int関数で小数点以下を切り捨てされ、1233が出力されます。」
と書いてあったのですが、もしそうならば、なぜ、
    a = 0.1234 * 10000
    Debug.Print Int(a)

    Debug.Print CInt(0.1234 * 10000)
のときは 1234 と表示されるのでしょうか?

また、
    Dim a as Double
        〜
    if(a = 123) then 
        〜
    else
        〜
    endif

    Dim a as Double
        〜
    if(abs(a-123) < 0.001) then 
        〜
    else
        〜
    endif
のようにしないといけないと書いてありましたが、もしそうなら、今まで作ったプログラムの多くを書き換えなければならなくなってしまうような気がします。本当にこうしないといけないのでしょうか?

長々とした文章でで申し訳ありませんが、ご存知の方がいらっしゃいましたら、ご教授お願い致します。

参考サイト
http://rhodes.fuis.fukui-u.ac.jp/nakata/comp/vb/vb.html


大吉末吉  2007-08-08 19:29:36  No: 137109

> Debug.Print CInt(0.1234 * 10000)
これは、
「Int 関数」は、「切捨て」処理なのに対して、
「CInt 関数」は、「丸め(四捨五入に似た動作)」処理だからでしょうね。

#ヘルプ(MSDNライブラリ)の該当関数に説明に書いてあります。

> Debug.Print Int(a)

こちらは、多分「変数に代入する」と言う処理で丸め処理が行われる(CDblが実行される)為だと思います。

例えば、
    Debug.Print (0.1234 * 10000) - 1234
    Debug.Print Int(0.1234 * 10000) - 1234
    Debug.Print CInt(0.1234 * 10000) - 1234
    Debug.Print CDbl(0.1234 * 10000) - 1234
こういうのを実行して見てください。

> 本当にこうしないといけないのでしょうか?
どうするかはともかく、「浮動小数計算は、誤差がある」事を前提にプログラムしなければならないのは確かですね。


山本  2007-08-09 07:26:03  No: 137110

ご回答ありがとうございます。
おかげさまで、実数の誤差についてだいぶん分かって来ました。
貴重なお時間のをさいて下さってどうもありがとうございました。


※返信する前に利用規約をご確認ください。




  


  このエントリーをはてなブックマークに追加