• ベストアンサー

演算について

演算についてよくわからないのですが、 Dim KeiA As Integer = 80 Dim KeiB As Integer = 70 Dim KeiC As Double = 61.08 Dim KeiD, KeiE As Double KeiD = KeiA - KeiC KeiE = KeiB - KeiC デバック時に自動変数で見てみると KeiDは18.92 KeiEは8.9200000000000017 になってしまいます。なぜKeiEは8.92ではないんでしょうか。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

小数の演算誤差です。 61.08は、内部で0.6108*10^2と表現されています。 2進数では、0.5=1/2、0.25=1/4、0.125=1/8 ... となるので、 0.6108≒0.500000000000 + ← 1/2     0.062500000000 + ← 1/16     0.031250000000 + ← 1/32     0.015625000000 + ← 1/64     0.000976562500 + ← 1/1024     0.000244140625 + ← 1/4096    =0.610595703125 の様に表現されます(仮数部8ビットの場合)。したがって、最後まで上手くまとまらなかったところが誤差になってしまいます。

sakasakasa
質問者

補足

なんとなくわかりました。なんか除算の時注意しなければとどっかで覚えたんでした(^^;今一番困っているのは、実はそのKeiDやKeiEを足して、また他の数字で割ったりといろいろその後も計算をしていきたいのですが、最初の時点で誤差が出てしまって、最終的に違う結果になってしまうんです。どうしたらよいでしょうか。KeiCを100倍して、すべての型はInteger型に書き直して最後の最後で100で割るという風にすればよいのでしょうか。

すると、全ての回答が全文表示されます。

その他の回答 (4)

回答No.5

質問とは関係ありませんが、 >Dim KeiD, KeiE As Double と記述すると、「KeiD」は Variant型になります。 Doubl型で宣言したいのであれば、下記の様に記述しましょう! Dim KeiD As Double Dim KeiE As Double

sakasakasa
質問者

補足

当方、VB.NET2002でした。よくわかってないですがVariant型はないのかも知れません。私はVariant自体知りませんでした(>_<)

すると、全ての回答が全文表示されます。
回答No.4

話がそれているかもしれませんが、、、 倍精度(Double)でなければならないのですよね? 単精度(Single)であれば、誤差が発生しませんでした。

sakasakasa
質問者

補足

DoubleをすべてSingleに直しデバッグしてみましたが、KeiD=18.9199982、KeiE=8.919998でした。ますます混乱してきました笑

すると、全ての回答が全文表示されます。
  • ymmasayan
  • ベストアンサー率30% (2593/8599)
回答No.3

> 最初の段階で誤差が出てしまって > そういうときはどうしたらよいでしょうか Doubleであれば充分有効数字がありますので誤差を無視して計算を続け、 最後に必要な桁数でまるめをすればいいでしょう。 小数点3桁を取るなら1000倍して0.5を足してINTをとって1000で割るとか。

sakasakasa
質問者

お礼

最後にだけ丸めだけをすればよかったんですね。途中でMath.Round関数で少数第2までにしてもうまく行かず困ってました。有効桁数の意味がよくわかってませんでした…。

すると、全ての回答が全文表示されます。
  • ymmasayan
  • ベストアンサー率30% (2593/8599)
回答No.2

KeiDとKeiEで様子が違うので戸惑っておられるのでしょうね。 Doubleということは浮動小数点に直されます。 Integerも計算時にDoubleに変換されます。 このとき、有限桁で表せないと打切り誤差が出ます。 80と61.08ではその打切り誤差がたまたま打ち消しあったのでしょう。 単精度なら正しく表示されると思います。

sakasakasa
質問者

補足

そうなんです(>_<)実は、Ano.1の方の補足質問にも書きましたが、 今一番困っているのは、そのKeiDやKeiEを足して、また他の数字で割ったりといろいろその後も計算をしていきたいのですが、最初の段階で誤差が出てしまって・・・。そういうときはどうしたらよいでしょうか。すいません質問ももっと詳しく書けばよかったです。

すると、全ての回答が全文表示されます。

関連するQ&A