Eclipse Verschiedene Ergebnisse bei Berechnung eines double-Werts

Red*Star

Mitglied
Hallo zusammen,

falls mir jemand für folgendes eine Erklärung geben kann, würde ich mich freuen:

Im angehängten Screenshot (die wichtigen Zeilen habe ich euch rot eingekreist) berechne ich frac auf zwei verschiedene Arten und Weisen:
Entweder direkt aus halfX.getDuration() (-> Wert landet in "frac2"), oder mit einem klitzekleinen Umweg über die Variablen val1 und val2 (-> Wert landet in "frac").

Die Frage ist ganz einfach: Wieso ist das Ergebnis unterschiedlich (siehe Debugger oben)?

getDuration() liefert einen long-Wert (Dauer in Milliseconds) zurück, bei dem habe ich auch überprüft, dass da wirklich 148 bzw. 216 Tage drinstehen. So oder so: M.E. sind die beiden Codestücke semantisch identisch...
Dass unterschiedliche Auswertungsreihenfolgen bei double/float nicht zu identischen Ergebnissen führen, ist mir natürlich auch klar - aber das ist ja gerade der Punkt: Hier gibt es ja eben keine unterschiedliche Auswertungsreihenfolge...

Das einzige, was ich mir noch denken könnte, wäre, dass der Debugger mir Müll ausgibt, das wäre dann aber jetzt auch das erste Mal.

Kennt jemand des Rätsels Lösung? Ist ein recht altes eclipse, vielleicht ist auch das noch eine mögliche Fehlerquelle...

(Bevor irgendwelche Kommentare über grottenschlechten Code-Style kommen: Ja, ich weiß ;). Er sieht so schlimm aus, weil ich gerade ziemlich rumgehacked habe, um dieses "lustige" Problem einzukreisen.)
 

Anhänge

  • screenshot_java_eclipse_cut.png
    screenshot_java_eclipse_cut.png
    60,2 KB · Aufrufe: 61

Marco13

Top Contributor
Nun, man müßte sich mal mit
javap -c DasProgram.class
den bytecode ansehen. Die JVM arbeitet stack-basiert, d.h. was da wann ausgewertet wird, ist nicht so leicht zu sagen. Dazu kommt noch, dass Prozessoren intern AFAIK mit 80 bit rechnen, auch wenn es nur um 64bit-Werte geht. Aber das ist eher Halbwissen. Schau' mal was rauskommt, wenn du deine Klasse als
public class strictfp DieKlasse
deklarierst.
 

P@u1

Aktives Mitglied
Ich vermute, dass das an der auswertungsreihenfolge liegt.

haben wir z.B. folgendes:
Java:
double small1 = 1.8355854432e-20;
double small2 = 1.4755467546766e-20;
double big1 = 5.5643634737346;
double big2 = 10.235525238257253;

Jetzt ist es für die genauigkeit ein unterschied, ob du
Java:
double result1 = (small1 * small2) * (big1*big2);
rechnest, oder
Java:
double result2 = ((small1 * big1) * small2) * big2;
rechnest.

Danach ist dann
result1 == 1.5425995658095722E-38
result2 == 1.5425995658095724E-38

Der grund ist, dass beim verrehnen von fließpunktzahlen, bei denen die größenordnungen verschieden sind, einige stellen "verworfen" werden müssen.
Wenn du zuerst die zahlen mit ähnlichen größenordnungen verrechnest und am ende den rest multiplizierst, dann sollte das ergebnis genauer sein.
Ich vermute aber, dass der compiler die reihenfolge ändern darf.

Hier kann man die Abweichung sehen:
Ideone.com | Online Java Compiler & Debugging Tool
 

Red*Star

Mitglied
Hast du dir meinen Code angesehen, P@u1 ? ;) Rein vom Code her ist die Reihenfolge identisch, der einzige Unterschied ist, dass ich die Ergebnisse der Konvertierungsaktion von long in double zwischenspeichere - sprich dein Argument ist zwar generell richtig, aber passt nicht auf meinen Code.

@Marco13: Die Disassemblierung hab ich mir nicht angeschaut, aber die strictfp-Variante hab ich mal probiert. Danke, das hat es "gefixed" (sofern man das bei floating point values so nennen kann). Laut Computeralgebraprogramm ist die numerische Approximation auf 10 Stellen von 148/216 gleich 0.6851851851, genau das kommt jetzt auch in beiden Fällen raus. Man lernt wirklich nie aus ;). Warum das jetzt vorher ungenauer war, wenn auf der FPU intern u.U. mit höherer Genauigkeit gerechnet wurde, bleibt mir aber schleierhaft ;).
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
P Verschiedene Aspekte einer idempotent API verstehen? Allgemeine Java-Themen 16
C Verschiedene Versionen mit Datenbanken Allgemeine Java-Themen 3
Thallius Verschiedene entities für gleichen Code…. Allgemeine Java-Themen 8
OnDemand Zentrale "Drehscheibe" für verschiedene APIs Allgemeine Java-Themen 14
M verschiedene Dokumente auslesen Allgemeine Java-Themen 1
MiMa Logging mit log4j2 in verschiedene Dateien? Allgemeine Java-Themen 22
J Verschiedene Runtime Versionen gleichzeitig? Allgemeine Java-Themen 12
H Klassen LibGDX - Verschiedene Klassen als Value in einer Map Allgemeine Java-Themen 8
P mehrer Verschiedene Objekte in einer Klasse erstellen. Allgemeine Java-Themen 4
K Verschiedene Sprachen Allgemeine Java-Themen 1
C -Verschiedene Versionen eines Programms verwalten Allgemeine Java-Themen 7
M Verschiedene Pilzartenerkennung Allgemeine Java-Themen 0
I Verschiedene Arrays auslesen Allgemeine Java-Themen 6
nrg Verschiedene JREs im Browser konfigurieren Allgemeine Java-Themen 6
S Best Practice verschiedene Exceptions fangen und neue Exception erzeugen Allgemeine Java-Themen 11
G DesignPattern Verschiedene Services Allgemeine Java-Themen 4
B Verschiedene Objekte in Abhängigkeit eines Typs instanziieren. Allgemeine Java-Themen 17
M massenhaft verschiedene Date-Pattern Allgemeine Java-Themen 3
R Implementierung eines Interface durch 2 verschiedene Klassen Allgemeine Java-Themen 6
faetzminator verschiedene Beans, verschiedene Felder "koppeln" Allgemeine Java-Themen 3
J Verschiedene Klassen als "Object" in ArrayList und dann in for-Schleife erzeugen!? Allgemeine Java-Themen 2
S Welche Datenstruktur für verschiedene Sprachen sinnvoll? Allgemeine Java-Themen 2
H Zwei verschiedene Dateien mittels einem Binärstream übertragen? Allgemeine Java-Themen 13
M verschiedene Methonden innerhalb des gleichen Threads Allgemeine Java-Themen 7
N verschiedene Klasse laden (Designfrage) Allgemeine Java-Themen 2
S Package in verschiedene Projekten einbinden? Allgemeine Java-Themen 3
D Verschiedene Datein aus einer Zip Datei ins Programm laden Allgemeine Java-Themen 4
D Verschiedene Persistenz Strategien Allgemeine Java-Themen 7
S Konstruktoren, verschiedene Klassen, Methoden. Allgemeine Java-Themen 3
M Verschiedene Modi bei AbstractTableModel Allgemeine Java-Themen 10
J Verschiedene Klassen, verschiedene Ströme? Allgemeine Java-Themen 6
V 1 Methode für viele verschiedene Klassen? Allgemeine Java-Themen 9
L Verschiedene Versionen eines Interfaces Allgemeine Java-Themen 12
J Verschiedene Starteinstellungen Allgemeine Java-Themen 7
J Programm für verschiedene Betriebssystem vertreiben? Allgemeine Java-Themen 10
M 2 verschiedene LookAndFeels in einem Fenster möglich? Allgemeine Java-Themen 6
D Gehts praktischer? Thema:Verschiedene Instanzen einer Klasse Allgemeine Java-Themen 3
C Verschiedene JDKs Allgemeine Java-Themen 6
M Regular Expression - verschiedene Ausdrücke testen (grep | ) Allgemeine Java-Themen 5
C verschiedene Klassenarten Allgemeine Java-Themen 3
G Verschiedene Auflösungen Allgemeine Java-Themen 6
H verschiedene Java Versionen Allgemeine Java-Themen 3
A Textfeld soll verschiedene Datumseingaben akzeptieren Allgemeine Java-Themen 5
B Mysteriöse Ergebnisse beim Baccarat Programm? Allgemeine Java-Themen 13
S Intressante Benchmark-Ergebnisse mit Listen. Weiss jemand wie man diese erklaeren kann? Allgemeine Java-Themen 15
J Bei einer Zufallsausgabe werden zu viel Ergebnisse ausgegeben Allgemeine Java-Themen 16
X HTTP Auslesen der Ergebnisse von einer Webseite und in eine Liste packen Allgemeine Java-Themen 1
E Falsche Ergebnisse bei PQ-Formel Berechnung Allgemeine Java-Themen 12
G Input/Output URLDecoder.decode - Unterschiedliche Ergebnisse Windows / Linux Allgemeine Java-Themen 2
C Batchdatei ausführen und Ergebnisse abfragen Allgemeine Java-Themen 8
D Problem mit java.util.scanner: Falsche Ergebnisse Allgemeine Java-Themen 4
K Regex für Ergebnisse (9:9, 2:1.) Allgemeine Java-Themen 3
Zrebna Berechnung der Zeit funktioniert nicht wie erwartet: Date, GregorianCalendar Allgemeine Java-Themen 16
pkm Berechnung der Fakultät von Fließkommazahlen anhand von Stirlingformel Allgemeine Java-Themen 4
I Berechnung Lagerbestands / Verfügbarkeitsprüfung Allgemeine Java-Themen 1
L RegEx für Teile einer Berechnung Allgemeine Java-Themen 14
L Korrektur nach der Berechnung vornehmen, aber wie? Allgemeine Java-Themen 11
D Berechnung des Cosinus Allgemeine Java-Themen 4
H float Berechnung: Ergebnis ohne wissenschaftliche Notation Allgemeine Java-Themen 5
A Fehlerhafte Nst Berechnung einer bestimmten Fkt. (Bisektion) Allgemeine Java-Themen 10
E Berechnung des Schnittpunktes von zwei Geraden Allgemeine Java-Themen 1
P Performate Zeiteiteiteilungs- Berechnung Allgemeine Java-Themen 4
B TileMap berechnung? Allgemeine Java-Themen 8
P jodaTime Berechnung Geburtstag Allgemeine Java-Themen 1
K Probleme bei Berechnung der Komplexität Allgemeine Java-Themen 7
S Welcher Schleifen type für eine Berechnung Allgemeine Java-Themen 7
B BlueJ Potenz Berechnung Allgemeine Java-Themen 16
W Berechnung Durchschnitt mit Schleife Allgemeine Java-Themen 9
M Berechnung verbessern Allgemeine Java-Themen 8
W OOP Berechnung des Skalarprodukts Allgemeine Java-Themen 9
H Demonstrationsprogramm zur CRC-Berechnung Allgemeine Java-Themen 2
D Berechnung von Sonnenauf und Sonnenuntergang Allgemeine Java-Themen 2
E Berechnung in Arraylist Allgemeine Java-Themen 10
N Optimierung einer Berechnung Allgemeine Java-Themen 17
G java.sql Time Berechnung Allgemeine Java-Themen 6
Eldorado Berechnung von Koordinaten, die zufällig aussehen Allgemeine Java-Themen 5
B Berechnung eines sinh abbrechen, wenn 16. Nachkommastelle sich nicht mehr ändert Allgemeine Java-Themen 7
J Berechnung anhand einer XML-Datei Allgemeine Java-Themen 3
Private Void rekursive vs. iterative Lösung für Berechnung der Fakultät Allgemeine Java-Themen 12
S YUV to RGB (einfache Berechnung) Allgemeine Java-Themen 5
G Programm zur Berechnung von Summe, Median, Erwartungswert, usw von einem Array Allgemeine Java-Themen 7
C Bilder rotieren, Denkfehler in der Berechnung? Allgemeine Java-Themen 2
B Berechnung von Punkten/ If-else Strategie?! Allgemeine Java-Themen 51
T Berechnung in zweidimensionalem Array Allgemeine Java-Themen 3
X hashCode() Berechnung Allgemeine Java-Themen 5
R Tabelle - Berechnung der "Zeilenart" Allgemeine Java-Themen 2
L Berechnung mit Module bis bes.timme Zahl erreicht. Allgemeine Java-Themen 4
P CRC Berechnung Allgemeine Java-Themen 2
J berechnung von potenzen und wurzel-ziehen ohne klasse " Allgemeine Java-Themen 14
D Problem bei einer Berechnung (pow?) Allgemeine Java-Themen 3
P Java-Programm zur Berechnung globaler Minimas und Maximas-ff Allgemeine Java-Themen 4
B Primzahlen Berechnung optimieren Allgemeine Java-Themen 7
A Probleme bei der Berechnung von Pi! Java Problem Allgemeine Java-Themen 2
M Servlet --> Berechnung --> Timeout vom Proxy oder IE!? Allgemeine Java-Themen 7

Ähnliche Java Themen


Oben