VB6のCDec関数について

解決


とっしー  2007-04-19 17:47:04  No: 136156

はじめましてこんにちは。
当方、小数点つきの値を変数へ積算させたいんですが
たとえば、下記のコードを実行すると積算後の変数に誤差がでます。
ですが、最近CDec関数をはさむと誤差がなくなる?ということをインターネットで知りました。
このCDec関数はこのように使うと浮動小数の変数なのに誤差がなくなるような関数なのでしょうか?

Private Sub Form_Load()
    Dim dblBuf As Double
    Dim dblCdec As Double
    Dim l As Long
    
    
    dblBuf = 0
    dblCdec = 0
    For l = 1 To 1000000
        dblBuf = dblBuf + 0.000001
        dblCdec = CDec(dblCdec + 0.000001)
    Next l
    
    MsgBox "dblBuf:" & dblBuf & vbCrLf & "dblCdec" & dblCdec

End Sub

dblBuf=1.00000000000792
dblCdec=1

よろしくお願いします。


魔界の仮面弁士  2007-04-19 19:51:37  No: 136157

> 変数に誤差がでます。
Double 型を使っていますからね。
浮動小数点数による誤差の概要については、下記を参照。
http://ja.wikipedia.org/wiki/%E6%B5%AE%E5%8B%95%E5%B0%8F%E6%95%B0%E7%82%B9%E6%95%B0#.E6.B5.AE.E5.8B.95.E5.B0.8F.E6.95.B0.E7.82.B9.E6.95.B0.E3.81.AE.E7.B2.BE.E5.BA.A6

誤差を含めたくないなら、通貨型か、10進型か、整数型を使う必要があります。
(通貨型は、内部的には 64bit整数型として扱われています)

> ですが、最近CDec関数をはさむと誤差がなくなる?ということをインターネットで知りました。
微妙に勘違いがあるかも。

途中の演算も含め、終始 10 進型のみで処理するのであれば良いのですが、
値を保持する変数や、その演算自体を浮動小数で処理しておいて、その一部だけを
CDec で 10 進型に変化させたとて、誤差を無くすことはできません。

浮動小数に、0.000001 という 10進数値を誤差なく格納させる事はできませんからね。
(0.000005 ならば、浮動小数でも誤差なく格納できるでしょうけれども)

> 浮動小数の変数なのに誤差がなくなるような関数なのでしょうか?
もちろん無理です。せいぜい、誤差が減ったように見せかけるという程度かと。

そもそも CDec を使ったとて、誤差を完全になくすことはできませんよね。(10÷3など)


とっしー  2007-04-19 21:32:45  No: 136158

魔界の仮面弁士 様ありがとうございます。
いかに誤差を少なくするかがポイントになると言うことですね。

丁寧に教えていただきまして、とても分かりやすかったです。ありがとうございました。


とっしー  2007-04-19 21:33:19  No: 136159

解決しました。


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




  


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