2016-03-31 18 views
9

doubleの最大精度を決定しようとしています。このリンクで受け入れられた回答のコメントRetain precision with double in Java @PeterLawreyは15で最大精度を述べています。doubleの最大精度を決定する方法

これはどのようにして決定しますか?直接

+2

[重複した質問のリンク先のwiki](https://en.wikipedia.org/wiki/Double-precision_floating-point_format)を見ましたか? JavaはIEEE 754浮動小数点倍精度を使用します。 –

答えて

6

@PeterLawreyは、彼がすべてで述べたものを実際にはありません15.

で最大の精度を述べています。彼が述べたことだった。

は、二重精度

の15小数点以下の桁数を持っており、彼は間違っています。彼らは15桁の数字の精度を持っています。

任意の数の桁数をベースに、そのログによって与えられる10. 15は、仮数のビット数である53ログ(2 -1)、床の値でありますJavadocおよびIEEE 754に記載されているように(暗黙のビットを含む)、そして2 -1は、可能な最大仮数値である。実際の値は、Windows電卓の限界まで15.954589770191003298111788092734です。

彼は「精度の小数点以下の桁」と表現するのは間違いです。 doubleは、すべてが小数点の前にある場合は、の数字15桁、精度の精度を持ちます。小数部を持つ数値の場合、10進表記では15桁を超える数を得ることができます。

+0

ありがとうございました。しかし、2^53の最大仮数値は15桁を意味しますか? –

+0

任意の数値の小数点以下の桁数は、その基数10のログによって与えられます。 – EJP

+2

「直線対数引数」は、整数にのみ適用されます。これはおそらく最後の段落で何を示しているのでしょうか。浮動小数点の場合、私がここで行うような派生をしなければなりません:http://www.exploringbinary.com/number-of-digits-required-for-round-trip-conversions/。ダブルスの場合、同じ答えが得られます(15)。 floatの場合、log_10(2^24-1)は約7.22ですが、最大精度は6です(http://stackoverflow.com/questions/30688422/is-the-most-significant-decimal-digits-precisionも参照してください)。 - バイナリに変換することができます。) –

0

あなたは可能性も「測定」、それを:

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

このコードのアイデアは、1つのビットと最小の数に到達することです。だから1(1ビットのみ)から始まり、最後のビットに達するまで2で割る(2進で右に向かってビットをシフトする)。このループによって印刷最後の番号である:

4.9E-324

+3

ダブルスは15桁の精度をどのように示していますか? – assylias

+1

倍精度浮動小数点数型(double)で表現可能な最小値は、その最大精度とは何も関係ありません。 1つは指数幅の関数であり、もう1つは仮数の幅です。 – EJP

0

実行し、このコード、それは

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"); 
    } 
} 

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

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

I ' 10進数で説明してください:4桁の精度がある場合、1.0000 - 0.0001を表すことができますが、1.00000-0.00001という数字を表すことはできません(5番目の小数点がありません)。この例では、4桁の精度で、イプシロンは0.0001です。イプシロンは浮動小数点精度を直接測定します。バイナリに変換するだけです。

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

+0

これは正確に何を表示することを意図していますか? – EJP

+0

浮動小数点精度に関連するイプシロン値の検索を試みます。 https://en.wikipedia.org/wiki/Machine_epsilonを参照してください(テーブルのbinary64行を参照してください) –

+0

彼は、εではなく浮動小数点精度自体について質問しています。彼は具体的には値15について質問しています。あなたは全く対処していません。 – EJP

-1

doubleの最大精度は0より大きい最初の値です.DoubleのJavadocによると、この数値はDouble.MIN_VALUEで表されます。

BigDecimal doubleMinVal = BigDecimal.valueOf(Double.MIN_VALUE); 
System.out.println(doubleMinVal.toPlainString()); 
System.out.println(doubleMinVal.toString()); 

は、例えばthis IDEOne programを参照してください:あなたは、出力が次のようにすることができます。

+1

私はそれが本当だとは思わない。私は、OPはダブルで意味のある有効数字の正確な数を知りたいと思う。可能な最小の(絶対)二倍の値は、負の指数部が最も大きく、数字の部分が最も小さいものです。 – Paul

+0

範囲と精度が混同されています。 – EJP

関連する問題