« FORTRAN と COBOL の代替言語はないかも | トップページ | 「変数のスコープは狭いほど良い」 »

2008年10月19日 (日)

固定小数点演算

基数変換誤差が問題となるのは、固定小数点だからなんですよね。浮動小数点演算では、計算値に対する精度が十分に大きければ、基数変換誤差を気にする必要はないわけでして。そう考えると、固定小数点と10進数演算は、常にセットで考えるものなのでしょう。2進固定小数点を見かけない理由でもあるわけですね。

さて、 Java の 固定小数点数 java.math.BigDecimal ではソースコードはこんな感じになります。

import java.math.*;

public class BigDecimalTest {

  public static void main(String[] args) {
    float fa = 0.4f;
    float fb = 0.3f;
    float fc = 0.1f;

    System.out.println(fa - fb - fc);

    final BigDecimal xa = new BigDecimal("0.4");
    final BigDecimal xb = new BigDecimal("0.3");
    final BigDecimal xc = new BigDecimal("0.1");
    final BigDecimal xd = xa.subtract(xb).subtract(xc);

    System.out.println(xd);
  }

}

実行結果:

-7.4505806E-9
0.0

確かに、うざったい感じですね。

精度、スケール、丸めの方向を java.math.MathContext 、および java.math.RoundingMode で細かく指定できるのは、良いと思いますけど。

忘れていましたが、 Microsoft .NET では、組み込み型で固定小数点がサポートされています。

ソースコードは以下のようになります。

using System;

namespace DecimalTest
{
    class Program
    {
        static void Main(string[] args)
        {
          float fa = 0.4f;
          float fb = 0.3f;
          float fc = 0.1f;

          Console.WriteLine(fa - fb - fc);

          decimal xa = 0.4m;
          decimal xb = 0.3m;
          decimal xc = 0.1m;

          Console.WriteLine(xa - xb - xc);

        }
    }
}

実行結果:

-7.450581E-09
0.0

精度は 128 ビットで固定されているようです。スケールを明示的に指定する方法はなさそうですね。丸めの方向も指定できなさそう。

組み込み型なのは良いのですが。 Java と良い点・悪い点が、ちょうど反対になっているのが面白いといいますか。

しかし、この .NET Framework マニュアルの説明はわけわからないですね。どこかでも話題になっていましたが。

Decimal 値型は、多数の有効な整数桁と小数桁を必要とし、丸め誤差を使用しない財務計算に適しています。

10 進数は、符号、値の各桁の範囲が 0 から 9 までの数値、数値の整数部と小数部を分ける浮動小数点の位置を示すスケール ファクタで構成される浮動小数点値です。

Decimal 構造体 (System)

「整数部と小数部を分ける ... スケール ファクタ」があるわけですから、固定小数点と呼ぶべきなのではないでしょうか。浮動小数点とは呼ばないのではないかと思うのですけど。

A decimal number is a floating-point value that consists of a sign, a numeric value where each digit in the value ranges from 0 to 9, and a scaling factor that indicates the position of a floating decimal point that separates the integral and fractional parts of the numeric value.

Decimal Structure (System)

小数点の桁位置を変えられることを、 ”floating-point value”, "floating decimal point" と言っているのですかね。かえって判りにくいような。

|

« FORTRAN と COBOL の代替言語はないかも | トップページ | 「変数のスコープは狭いほど良い」 »

コメント

コメントを書く



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


コメントは記事投稿者が公開するまで表示されません。



トラックバック

この記事のトラックバックURL:
http://app.f.cocolog-nifty.com/t/trackback/80472/24598650

この記事へのトラックバック一覧です: 固定小数点演算:

« FORTRAN と COBOL の代替言語はないかも | トップページ | 「変数のスコープは狭いほど良い」 »