double Vergleich

Neumi5694

Top Contributor
Kurze Frage, vielleicht weiß da jemand was. Immer wieder stolpert man in diversen Sourcecodes über diesen Ausdruck,
[CODE lang="java" title="z.B. in Double.compare(...)"]boolean isEqual = Double.doubleToLongBits(d1) == Double.doubleToLongBits(d2);[/CODE]
An anderen Orten wird einfach verglichen:
[CODE lang="java" title="z.B. in Point2D.compare(...)"]boolean isEqual = d1 == d2;[/CODE]

Was spricht für die eine Methode, was für die andere (Performance, Genauigkeit, sonstwas)?
Oder wird gar der untere Ausdruck beim Kompilieren in den oberen umgeschrieben?
 
K

kneitzel

Gast
JLS 15.21.1 beschreibt den Vergleich mit ==, dabei ist wichtig, dass x != x true ist, wenn x NaN ist.

Bei doubleToLongBits (Methode ist ja dokumentiert!) ist NaN 0x7ff8000000000000L und damit würden zwei NaN Werte als gleich angesehen.
Das dürfte der Hauptunterschied sein.
 

Neumi5694

Top Contributor
Java:
  public static void main(String[] args) {
    System.out.println(0 == -0);
    System.out.println(Double.doubleToLongBits(0) == Double.doubleToLongBits(-0));
    System.out.println(Double.doubleToRawLongBits(0) == Double.doubleToRawLongBits(-0));
    double d1 = 0;
    double d2 = -0;
    System.out.println(d1 == d2);
    System.out.println(Double.doubleToLongBits(d1) == Double.doubleToLongBits(d2));
    System.out.println(Double.doubleToRawLongBits(d1) == Double.doubleToRawLongBits(d2));
    double d3 = 60 * 0;
    double d4 = -60 * 0;
    System.out.println(d3 == d4);
    System.out.println(Double.doubleToLongBits(d3) == Double.doubleToLongBits(d4));
    System.out.println(Double.doubleToRawLongBits(d3) == Double.doubleToRawLongBits(d4));
  }

Ausgabe mit JDK 17:
true
true
true
true
true
true
true
true
true
Keine Ahnung, wie ich's vorhin geschafft hab, mal false rauszukriegen, vielleicht ein Tippfehler.

Auf jeden Fall ist die Frage eh beantwortet, danke :)
 

Neumi5694

Top Contributor
Doh!
Besonders in den Fällen mit double-Variablen wundert mich das aber schon. Der Compiler ersetzt das nicht so, wie ich's bisher angenommen hab.
 
G

Gelöschtes Mitglied 65838

Gast
fancy wirds auch wenn du mit konstanten arbeitest zb
das ist erlaubt
Java:
final byte x = 0;
final byte y = 0;
byte z = x + y;
das ist nicht erlaubt und wird nen fehler werfen, weil du es noch nach byte casten müsstest
Java:
 byte x = 0;

 byte y = 0;

byte z = x + y;
 
G

Gelöschtes Mitglied 65838

Gast
Das sieht meine JShell anders:
Code:
jshell> final byte x = 0;
   ...> final byte y = 0;
   ...> byte z = x + y;
x ==> 0
y ==> 0
|  Error:
|  incompatible types: possible lossy conversion from int to byte
|  byte z = x + y;
|           ^---^

Für den Compiler ist es ok :)
probier es in eclipse oder intellij ... ka was die jshell macht .. kopier das in die main rein
Java:
    final byte x = 4;
    final byte y = 3;
    byte z = x + y;
    System.out.println(z);
soweit ich weis macht der compiler dadurch dass es final ist schon irgendwas mit dem datentyp und deswegen funktionierts... hatte das mal wo aufgeschnappt und bin mir 100% sicher dass das in einem normalen java programm funktioniert

bei mir kommt auch die 7 raus

jetzt fehlt mir wieder knietzel der findet immer so ne JLS definition die perfekt passt :(
 
G

Gelöschtes Mitglied 65838

Gast
er wollte seinen Acc gelöscht haben, im Martin Sellner post hatte er paar sachen erwähnt

zb dass es ihm auf den sack gegangen ist dass leute deklariert und initialisiert nicht richtig bneutzt haben und wenn man eine JLS Link hinlegt die leute diskutieren dass das was im JLS link drin steht nicht richtig sein soll.. oder was er explizit erwähnt hatte
Irgendein User: mach var weg
Erfahrernenr : var gibts seit java 10
Irgendein User: mach trotzdem das var weg sieht nicht richtig aus
 

mihe7

Top Contributor
soweit ich weis macht der compiler dadurch dass es final ist schon irgendwas mit dem datentyp und deswegen funktionierts...
Ja, mich hatte es gewundert, dass die JShell das anders sieht. Liegt vermutlich daran, dass man Variablen redeklarieren kann, wenn man es in eine Klasse packt, funktioniert es auch dort.

Und ja, der Compiler ersetzt x+y durch das Ergebnis. Wenn Du z. B. x = 127 und y = 3 setzt, bekommst Du einen Fehler.

Wo ist er denn? (war ein paar Tage nicht hier auf java-forum.org und plötzlich steht bei seinem User nur noch "Gast"....) Was ist los?
Keine Ahnung, was da passiert ist. Er hat irgendwo angekündigt, dass er bald weg sein wird und auf meine Frage, was passiert sei, hat er nicht geantwortet. In einem anderen Thread hat er geschrieben, dass er keinen Bock mehr auf überflüssige Diskussionen hat.
 

httpdigest

Top Contributor
By the way, hier ist die JLS Erklärung: https://docs.oracle.com/javase/specs/jls/se8/html/jls-5.html#jls-5.2
In addition, if the expression is a constant expression (§15.28) of type byte, short, char, or int:
  • A narrowing primitive conversion may be used if the type of the variable is byte, short, or char, and the value of the constant expression is representable in the type of the variable.
Das "final" macht also aus der Variablen eine "Konstante" und dann kann der Compiler schon zur Compilezeit (constant-folding) den finalen Wert von `z` berechnen (siehe javap Output unten für deinen Code). Natürlich wäre die Variable effektiv auch ohne das final noch konstant (weil kein weiterer Wert zugewiesen wird), das prüft aber der Compiler wohl nicht explizit ab.

javap -v output:
Code:
 0: iconst_4
 1: istore_1
 2: iconst_3
 3: istore_2
 4: bipush        7 // <- gleich 7!
 6: istore_3
 7: getstatic     #7                  // Field java/lang/System.out:Ljava/io/PrintStream;
10: iload_3
11: invokevirtual #13                 // Method java/io/PrintStream.println:(I)V
 

Neumi5694

Top Contributor
er wollte seinen Acc gelöscht haben, im Martin Sellner post hatte er paar sachen erwähnt

zb dass es ihm auf den sack gegangen ist dass leute deklariert und initialisiert nicht richtig bneutzt haben und wenn man eine JLS Link hinlegt die leute diskutieren dass das was im JLS link drin steht nicht richtig sein soll.. oder was er explizit erwähnt hatte
Das klingt verdammt nach "Bring Popcorn mit"
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
JAnruVA Datentypen Berechneten String-Wert in Double umwandeln um weiter zu rechnen Allgemeine Java-Themen 7
G Modulo - double Allgemeine Java-Themen 21
ReinerCoder Eclipse Fehlermeldung - The constructor Double(double) is deprecated Allgemeine Java-Themen 8
O Variablen Addition von Double-Werten ergibt seltsame 0.9999999 Zahlen Allgemeine Java-Themen 2
B Long in einen Double umwandeln und im Label anzeigen Allgemeine Java-Themen 7
VfL_Freak Double mit zwei festen NK-Stellen ausgeben Allgemeine Java-Themen 9
B List<Integer> ist List<Double> ? Allgemeine Java-Themen 6
SkyScreamer Variablen Int umwande in Double/ 1 Miner = 5 Cookies/s Allgemeine Java-Themen 2
T Teile eines Double-Wertes verändern Allgemeine Java-Themen 2
T Double salted bcrypt Allgemeine Java-Themen 0
A Zahl abgerundet obwohl Double Allgemeine Java-Themen 9
R jTable, nur Werte zwischen 2 Double values ausgeben Allgemeine Java-Themen 3
Y String to Double ohne ParseDouble Allgemeine Java-Themen 11
D Double aus String auslesen Allgemeine Java-Themen 8
M double Array Allgemeine Java-Themen 8
P Wird double und float auf jedem Computer gleich berechnet? Allgemeine Java-Themen 10
C String in double[][] konvertieren! Allgemeine Java-Themen 5
M Cast double[]-->Object[] oder Vector<double[]> Allgemeine Java-Themen 3
Zettelkasten Double --> Integer Allgemeine Java-Themen 4
M float, double, BigDecimal Allgemeine Java-Themen 5
S Variablen Prüfen ob Number vom Typ Integer, Float, Double, ... ist Allgemeine Java-Themen 2
J String mit "," in Double Wert konvertieren Allgemeine Java-Themen 7
R Eclipse Verschiedene Ergebnisse bei Berechnung eines double-Werts Allgemeine Java-Themen 5
B Variablen Bug of Float. & Double.MIN_VALUE! Allgemeine Java-Themen 4
T ArrayList<double[]> persitent anlegen Allgemeine Java-Themen 7
K double Zufallszahl Allgemeine Java-Themen 6
S String in Double - letztes Zeichen fehlt Allgemeine Java-Themen 4
T int <-> integer, double <-> Double... Allgemeine Java-Themen 2
J Umstellung von double auf BigDecimal Allgemeine Java-Themen 5
H2SO3- String 1.000,00 in double umwandeln Allgemeine Java-Themen 12
S Double-Checked Locking Allgemeine Java-Themen 4
I 2D-Grafik Polygon mit Double Werten zeichnen Allgemeine Java-Themen 4
M FIFO Queue: bytes in, float/double/etc out Allgemeine Java-Themen 5
H double dispatch und equals(Object) Allgemeine Java-Themen 6
vandread Float/Double probleme bei der Multiplikation?! Allgemeine Java-Themen 3
J Casting Problem Object, Double und String Allgemeine Java-Themen 3
F double auf 2 Nachkommastellen runden Allgemeine Java-Themen 9
D Double to Integer - ist das möglich? Allgemeine Java-Themen 3
T Object auf Double, Int, String testen Allgemeine Java-Themen 5
H2SO3- großen double in string mit e umwandeln Allgemeine Java-Themen 4
T Problem: Double als Geldbetrag - Rundungsfehler Allgemeine Java-Themen 5
P große double Zahlen und modulo Allgemeine Java-Themen 8
G Double Wert über OutputStream verschicken Allgemeine Java-Themen 2
M größer als double? Allgemeine Java-Themen 4
N Double ohne Wissenschaftliche Schreibweiße Allgemeine Java-Themen 5
M Double Braces Notation um Collections zu initialisieren Allgemeine Java-Themen 9
R Eigene ArrayList vom Typ Short, Integer oder Double Allgemeine Java-Themen 4
R Double Werte aus byte[] auslesen Allgemeine Java-Themen 5
T XStream.toXML => double mit , anstelle . Allgemeine Java-Themen 3
G Fehler bei Array.getDouble mit Double[] als Argument! Allgemeine Java-Themen 6
A Problem bei Übergabe von Werten in ein double Array. Allgemeine Java-Themen 21
M Double immer mit 2 Kommastellen Allgemeine Java-Themen 3
G double in Date Allgemeine Java-Themen 5
reibi double-Wert auf 2 Stellen nach dem Komma abschneiden Allgemeine Java-Themen 6
G Genauigkeit von Double Allgemeine Java-Themen 2
F Double mit Streams aus Datei einlesen Allgemeine Java-Themen 3
V "double in Exponentialschreibweise" normal ausgebe Allgemeine Java-Themen 2
S List<Double> oder Double[] in double[] zu konvertieren Allgemeine Java-Themen 6
C casten vom Typ Object nach Double[][] Allgemeine Java-Themen 2
E int vs. float vs. double Allgemeine Java-Themen 7
T cast Object to Double[] Allgemeine Java-Themen 2
DEvent double von c nach Java Allgemeine Java-Themen 4
K Double-Zahl runden Allgemeine Java-Themen 4
J double 3.0 soll ohne Nachkommastelle ausgegeben werden Allgemeine Java-Themen 12
S Java Double addieren Allgemeine Java-Themen 3
A string zu double Allgemeine Java-Themen 3
T double to object Allgemeine Java-Themen 3
J Große Zahl (double) as text ausgeben? Allgemeine Java-Themen 2
G Verständnisproblem double und float Allgemeine Java-Themen 7
padde479 String in double parsen Allgemeine Java-Themen 6
E double auf int runden, nicht abschneiden Allgemeine Java-Themen 2
G Double Zahl quadrieren Allgemeine Java-Themen 8
C double Zahlen mit drei NachkommaStellen in String umwandeln Allgemeine Java-Themen 2
T Nachkommastellen double Allgemeine Java-Themen 18
M double aufrunden Allgemeine Java-Themen 6
W Division mit float und double Allgemeine Java-Themen 2
D JTextfield für double werte Allgemeine Java-Themen 2
S Format von Double Allgemeine Java-Themen 9
F Umwandlungsproblem mit double Allgemeine Java-Themen 2
S Problem! Lösung mit Double buffering Allgemeine Java-Themen 3
T Vector <-> double Allgemeine Java-Themen 4
W float/double verhält sich seltsam Allgemeine Java-Themen 6
D Double: Grenzen und Darstellung Allgemeine Java-Themen 7
W String to Double (landesspezifisch) Allgemeine Java-Themen 14
T Fließkomma (double) richtig runden Allgemeine Java-Themen 7
P Class zu Integer, String, Double etc. Allgemeine Java-Themen 11
R Fehler in WindowsXP oder Java? - double in int konvertieren Allgemeine Java-Themen 10
E NumberFormatException bei cast auf double Allgemeine Java-Themen 5
D Wann ist das ergebnis einer Rechnung eine Double? Allgemeine Java-Themen 7
G Double Zahl auf 4 Stellen hinter Komma kuerzen Allgemeine Java-Themen 4
G warum operator || cannot be applied to int, double Allgemeine Java-Themen 11
A Probleme Umwandlung Ausdruck String in double Allgemeine Java-Themen 4
B Double-Wert aus einem HexString erstellen. Allgemeine Java-Themen 11
R Double Buffering zu langsam Allgemeine Java-Themen 11
C Bug in Java1.4.2_03 mit double Allgemeine Java-Themen 5
H Double mit 2 Nachkommastellen speichern. Allgemeine Java-Themen 5
C Double zu Hex oder Byte Allgemeine Java-Themen 4
M Vergleich C# und Java Allgemeine Java-Themen 24
D Vergleich OracleJDK/OpenJDK Allgemeine Java-Themen 7
T Komplexitätsoptimierung String vergleich Allgemeine Java-Themen 4

Ähnliche Java Themen

Neue Themen


Oben