Double型のバグ?

解決


まつい  2004-08-13 03:38:38  No: 85116  IP: [192.*.*.*]

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim a As Double = 0.234
        Dim b As Double = (0.236 - 0.002)

Debug.WriteLine(a = b)
End Sub

答えがFalseになってしまいます!

編集 削除
JAN  2004-08-13 05:57:58  No: 85117  IP: [192.*.*.*]

バグというより計算機の宿命ですね

0.234と0.002では指数部の値が異なっており、またそれぞれの数値が2進数で
は割り切れない数字なので、2つの数字を演算する時の指数部の変換の際に
どうしても誤差が出てしまいます。

ためしに下記計算ではTrueになると思いますよ
a=0.234
b=0.334 - 0.1
とか
a = 0.625
b = 0.5625 + 0.0625

という性質があるので小数の比較で=演算子を使用するのはプログラム上
避けたほうがいいでしょう。

編集 削除
JAN  2004-08-13 06:04:20  No: 85118  IP: [192.*.*.*]

>0.234と0.002では
訂正)0.236と0.002では

編集 削除
まつい  2004-08-13 13:46:34  No: 85119  IP: [192.*.*.*]

なんと。計算機の宿命でしたか。勉強になりました。

編集 削除