« データ項目(データ型) | トップページ | SQL SELECT »

2007年4月30日 (月)

数値計算の精度(浮動小数点の計算誤差)

COBOL
小数点のある計算や割り算がある計算をする場合、計算精度を考慮しなければなりません。
小数点を避ける
小数点があるとわかっている場合は整数化して計算する。
COMPUTE A = B * 0.785

COMPUTE A = B * 785
COMPUTE A = A / 1000

割り算は最後にする
COMPUTE A = A / B * C
COMPUTE A = B * C / B

VB.NET
倍精度型数値では正しい値が得られません。Decimal型を使いましょう。
計算精度の検証1
Module Module1
    Sub Main()
        Dim A As Double = 0
        Dim B As Decimal = 0
        For i As Integer = 1 To 100
            A += 0.1
            B += 0.1
        Next
        Console.WriteLine("0.1を100回加算する")
        Console.WriteLine("倍精度型" & A)
        Console.WriteLine("十進型" & B)
    End Sub
End Module

0.1を100回加算する
倍精度型9.99999999999998
十進型10

計算精度の検証2
以下のような場合、Decimal型を使っても正しく計算できません。
Module Module1
    Sub Main()
        Dim A As Double = 1.1 - 1 - 0.1
        Dim B As Decimal = 1.1 - 1 - 0.1
        Console.WriteLine("計算式1.1 - 1 - 0.1")
        Console.WriteLine("倍精度型" & A)
        Console.WriteLine("十進型" & B)
    End Sub
End Module

計算式1.1 - 1 - 0.1
倍精度型8.32667268468867E-17
十進型0.0000000000000000832667268469

計算精度の検証2-1
定数には末尾にDを付けることでDecimal数値となります。
Module Module1
    Sub Main()
        Dim A As Double = 1.1 - 1 - 0.1
        Dim B As Decimal = 1.1D - 1D - 0.1D
        Console.WriteLine("計算式1.1 - 1 - 0.1")
        Console.WriteLine("倍精度型" & A)
        Console.WriteLine("十進型" & B)
    End Sub
End Module

計算式1.1 - 1 - 0.1
倍精度型8.32667268468867E-17
十進型0.0

お役に立てましたか?
IT、プログラミングのランキングサイトはこちらです。

にほんブログ村 IT技術ブログへ 人気blogランキングへ FC2 Blog Rankingへ


最新記事の自動受信登録はこちらです。

はてなRSSに追加

livedoor Readerに追加
My Yahoo!に追加
Googleに追加
goo RSSリーダーに追加

|

« データ項目(データ型) | トップページ | SQL SELECT »

コメント

コメントを書く



(ウェブ上には掲載しません)




« データ項目(データ型) | トップページ | SQL SELECT »