2016-03-31 11 views
9

Ich versuche zu bestimmen, was die maximale Genauigkeit für ein Doppel ist. In den Kommentaren für die akzeptierte Antwort in diesem Link Retain precision with double in Java @PeterLawrey gibt maximale Präzision in 15 an.So ermitteln Sie die maximale Genauigkeit für Doppel

Wie ermitteln Sie dies?

+2

Haben Sie das [verlinkte Wiki in der Duplikatsfrage] (https://en.wikipedia.org/wiki/Double-precision_floating-point_format) angeschaut? Java verwendet IEEE 754 Fließkomma-Doubles. –

Antwort

6

@PeterLawrey heißt max Präzision in 15.

Das ist eigentlich nicht das, was er überhaupt erwähnt. Was er sagte war:

Doppel hat 15 Dezimalstellen Genauigkeit

und er ist falsch. Sie haben 15 Dezimal Ziffern der Genauigkeit.durch ihren Logarithmus zur Basis

Die Anzahl der Dezimalziffern in einer beliebigen Anzahl gegeben ist 10. 15 ist der Boden Wert von log (2 -1), wobei 53 die Anzahl der Bits der Mantisse (einschließlich des implizierten Bits), wie in dem Javadoc und IEEE 754 beschrieben, und daher ist der maximal mögliche Mantissenwert 1 -1. Der tatsächliche Wert liegt bei 15.954589770191003298111788092734 an den Grenzen des Windows-Rechners.

Er ist völlig falsch, es als "Dezimalstellen der Genauigkeit" zu beschreiben. A double hat 15 Dezimal Ziffern der Genauigkeit , wenn sie alle vor dem Dezimalpunkt liegen. Für Zahlen mit Nachkommastellen können Sie aufgrund der Inkommensurabilität von Dezimal- und Binärbrüchen deutlich mehr als 15 Ziffern in der Dezimalzahl erhalten.

+0

danke klärt es ein bisschen. Allerdings bedeutet 2^53 max Mantisse Wert 15 Ziffern? –

+0

Die Anzahl der Dezimalziffern in einer beliebigen Zahl wird durch ihr Logarithmus zur Basis 10 angegeben. – EJP

+2

Das Argument "gerades Logarithmus" bezieht sich nur auf Ganzzahlen, was Sie vielleicht im letzten Absatz sagen. Für Floating-Point müssen Sie eine Ableitung wie ich hier machen: http://www.exploringbinary.com/number-of-digits-required-for-round-trip-conversions/. Für Doppel erhalten Sie die gleiche Antwort (15); Für Floats ist log_10 (2^24-1) ungefähr 7.22, aber die maximale Genauigkeit ist 6. (Siehe auch http://stackoverflow.com/questions/30688422/is-the-most-significant-decimal-digits-precision -das-kann-in-binär konvertiert werden.) –

0

Sie könnten auch „messen“ es direkt:

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

Die Idee dieses Codes ist die kleinste Zahl mit einem einzigen Bit zu erreichen. Sie beginnen also mit 1 (die nur 1 Bit hat) und dividieren durch zwei (die Bits in binär nach rechts verschiebt), bis Sie das letzte Bit erreichen. Die letzte Zahl von dieser Schleife gedruckt ist:

4.9E-324

+3

Wie zeigt das, dass Doppel 15-stellige Genauigkeit haben? – assylias

+1

Der kleinste im Double darstellbare Wert hat überhaupt nichts mit seiner maximalen Genauigkeit zu tun. Eine ist eine Funktion der Exponentenbreite, die andere der Mantissenbreite. – EJP

0

diesen Code ausführen, und sehen, wo es aufhört

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

Variable y den kleinsten Wert anders als 1.0 wird . Auf meinem Computer (Mac Intel Core i5) stoppt es bei 1.1102...E-16. Es gibt dann die Genauigkeit aus (in Dezimal und in Binär).

Wie in https://en.wikipedia.org/wiki/Machine_epsilon angegeben, kann die Gleitkomma-Genauigkeit mit dem Epsilon-Wert geschätzt werden. Es ist "die kleinste Zahl, die, wenn addiert, ergibt ein anderes Ergebnis als eins" (Ich habe eine kleine Variation: 1-e anstelle von 1 + e, aber die Logik ist die gleiche)

I '

ll erklären in dezimal: Wenn Sie eine 4-Dezimale Genauigkeit haben, können Sie 1,0000 - 0,0001 ausdrücken, aber Sie können die Zahl 1,00000-0,00001 nicht ausdrücken (Ihnen fehlt die fünfte Dezimalstelle). In diesem Beispiel ist das Epsilon mit einer Genauigkeit von 4 Dezimalstellen 0,0001. Das Epsilon misst direkt die Gleitkomma-Genauigkeit. Transponiere einfach zu binär.

Bearbeiten Ihre Frage wurde gestellt "Wie zu bestimmen ...". Die Antwort, die Sie suchten, war eher eine Erklärung als eine Möglichkeit, die Genauigkeit zu bestimmen (mit der Antwort, die Sie akzeptierten). Wie auch immer, für andere Leute bestimmt die Ausführung dieses Codes auf einer Maschine die Genauigkeit für den "doppelten" Typ.

+0

Was genau soll das zeigen? – EJP

+0

Es wird versucht, den Epsilon-Wert zu finden, der sich auf die Gleitkomma-Genauigkeit bezieht. Siehe https://en.wikipedia.org/wiki/Machine_epsilon (siehe die Zeile binary64 in der Tabelle) –

+0

Er fragt nach der Fließkomma-Präzision selbst, nicht nach dem Epsilon, und er fragt speziell nach dem Wert 15, die Sie überhaupt nicht angesprochen haben. – EJP

-1

Die maximale Genauigkeit von double von ist der erste Wert größer als 0. Nach Double's Javadoc wird diese Zahl durch Double.MIN_VALUE dargestellt. Sie können die Ausgabe es wie folgt:

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

this IDEOne program für ein Beispiel.

+1

Ich glaube nicht, dass das stimmt. Ich bin der Meinung, dass das OP die genaue Anzahl der signifikanten Zahlen, die für ein Double aussagekräftig sind, wissen möchte. Der kleinstmögliche (absolute) Doppelwert ist nur derjenige mit dem größten negativen Exponentialanteil und dem kleinsten Zahlenanteil. – Paul

+0

Sie verwechseln Präzision mit Bereich, wie mehrere andere Antworten hier. – EJP

Verwandte Themen