2017-05-16 2 views
4

Führt die Division zwischen zwei Doppelwerten auf der JVM immer zu genau demselben Ergebnis wie die Ganzzahldivision?Ist die doppelte Division gleich der ganzzahligen Division, wenn kein Rest vorhanden ist?

mit den folgenden Voraussetzungen:

  • der Division ohne Rest
  • No Division durch Null
  • Sowohl x und y halten tatsächlich ganzzahlige Werte.

z. im folgenden Code

double x = ...; 
int resultInt = ...; 
double y = x * resultInt; 
double resultDouble = y/x; // double division 

tut resultDouble immer gleich resultInt oder könnte einen gewissen Verlust an Präzision da sein?

+0

Es gibt nur 4 Milliarden 32-Bit-Ints. Sie können dies einfach durch Aufzählung aller Werte testen. – the8472

Antwort

3

Ja, wenn x und y sind beide in der int lief ge, es sei denn die Teilung ist -2147483648.0/-1.0. In diesem Fall wird das doppelte Ergebnis dem Ergebnis der Ganzzahldivision entsprechen, aber nicht int.

Wenn beide Divisionseingänge im Bereich int sind, sind sie beide genau als double darstellbar. Wenn ihr Verhältnis eine ganze Zahl ist und die Division nicht -2147483648.0/-1.0 ist, ist das Verhältnis in dem int Bereich und so genau wie double darstellbar. Der Wert double ist der Wert, der dem Ergebnis der Division am nächsten kommt, und muss daher das Ergebnis der Division double sein.

Diese Argumentation gilt nicht notwendigerweise, wenn x und y ganze Zahlen außerhalb des int Bereichs sind.

+0

Ihre Aussage ist nicht immer wahr: '-2147483648.0/-1.0! = -2147483648/-1' – apangin

+0

@apangin Guter Punkt. Ich werde die Antwort bearbeiten. –

4

Es gibt zwei Gründe dafür, dass ein int zu einem doppelten oder einem Schwimmer zuweisen Präzision verlieren könnte:

  • Es gibt bestimmte Zahlen, die einfach nicht als Doppel/float dargestellt werden, so dass sie am Ende angenähert zu viel Präzision in den lease-signifikanten stellen
  • große ganze Zahlen enthalten können

so ist es depeands auf, wie groß der int ist, aber in Java ein Doppel verwendet einen 52-Bit-Mantisse, werden so in der Lage zu vertreten eine 32-Bit-Ganzzahl ohne Datenverlust.

Das sind fabolous Beispiele in diesen beiden Seiten:

1- Java's Floating-Point (Im)Precision

2- About Primitive Data Types In Java

auch prüfen:

Loss of precision - int -> float or double

3

Die Aussage ist wahr mit Ausnahme von Integer.MIN_VALUE, wobei das Ergebnis der Division zweier Ganzzahlen außerhalb des ganzzahligen Bereichs liegen kann.

int n = Integer.MIN_VALUE; 
    int m = -1; 
    System.out.println(n/m);       // -2147483648 
    System.out.println((int) ((double)n/(double)m)); // 2147483647