web-dev-qa-db-ja.com

doubleの最大精度を決定する方法

私は倍精度の最大精度が何であるかを決定しようとしています。このリンクの承認された回答のコメントで Javaでdoubleを使用して精度を保持 @PeterLawreyは15の最大精度を示しています。

これをどのように判断しますか?

14
Shivam Sinha

@PeterLawreyは15で最大精度を示しています。

それは実際には彼がまったく言ったことではありません。彼が言ったことは:

doubleの小数点以下15桁の精度

そして彼は間違っています。 15桁の10進数の精度があります。

任意の数の10進数の桁数は、その対数で10を底とする数値で与えられます。15は対数の下限値です10(253-1)。ここで、53は、JavadocおよびIEEE 754で説明されているように、仮数のビット数(暗黙のビットを含む)です。253したがって、-1は最大の仮数値です。実際の値は、15.954589770191003298111788092734であり、Windows電卓の限界値までです。

彼がそれを「精度の十進法の場所」と表現するのはかなり間違っています。 doubleには15桁の小数点があります精度すべて小数点の前にある場合小数部分を含む数値の場合、15桁を超える桁数を得ることができます10進数と2進数の分数が一致しないため、10進数表現。

10
user207421

直接「測定」することもできます。

for(double d = 1 ; d > 0 ; d/=2) System.out.println(d);

このコードのアイデアは、1つの単一ビットで最小数に到達することです。だからあなたは1(1ビットしかありません)、最後のビットに到達するまで2で除算します(2進数でビットを右にシフトします)。このループによって出力される最後の数は次のとおりです。

4.9E-324

0
Maljam

このコードを実行し、停止する場所を確認します

public class FindPrecisionDouble {
  static public void main(String[] args) {
    double x = 1.0;
    double y = 0.5;
    double epsilon = 0;
    int nb_iter = 0;
    while ((nb_iter < 1000) && (x != y)) {
        System.out.println(x-y);
        epsilon = Math.abs(x-y);
        y = ( x + y ) * 0.5;
    }
    final double prec_decimal = - Math.log(epsilon) / Math.log(10.0);
    final double prec_binary = - Math.log(epsilon) / Math.log(2.0);
    System.out.print("On this machine, for the 'double' type, ");
    System.out.print("epsilon = " );
    System.out.println( epsilon );
    System.out.print("The decimal precision is " );
    System.out.print( prec_decimal );
    System.out.println(" digits" );
    System.out.print("The binary precision is " );
    System.out.print( prec_binary );
    System.out.println(" bits" );
  }
}

変数yは、1.0とは異なる最小値になります。私のコンピューター(Mac Intel Core i5)では、1.1102...E-16で停止します。次に、精度を出力します(10進数と2進数で)。

https://en.wikipedia.org/wiki/Machine_epsilon に記載されているように、浮動小数点精度はイプシロン値で推定できます。これは、「1に追加したときに1とは異なる結果が得られる最小の数」です(私はわずかな変化をしました:1 + eではなく1-eですが、ロジックは同じです)。

10進数で説明します。4桁の精度がある場合、1.0000-0.0001を表すことができますが、1.00000-0.00001の数を表すことはできません(5桁の10進数がありません)。この例では、4桁の精度で、イプシロンは0.0001です。イプシロンは、浮動小数点の精度を直接測定します。バイナリに転置するだけです。

編集あなたの質問は、「どうやって決定するか...」と尋ねました。あなたが探していた答えは、(あなたが受け入れた答えを使って)正確さを判断する方法よりも説明でした。とにかく、他の人にとっては、このコードをマシンで実行すると、「double」型の精度が決まります。

0
Sci Prog