Java rechnet falsch! – SELFHTML-Forum Forum als Ergänzung zum SELFHTML-Wiki und zur Dokumentation SELFHTML https://forum.selfhtml.org/self Java rechnet falsch! Sun, 21 Jan 07 20:30:53 Z https://forum.selfhtml.org/self/2007/jan/21/java-rechnet-falsch/1069720#m1069720 https://forum.selfhtml.org/self/2007/jan/21/java-rechnet-falsch/1069720#m1069720 <p>System.out.println(1.1 * 100);</p> <p>=> 110.00000000000001</p> <p>Bei Nachforschungen über dieses unerwartete Ergebnis habe ich folgendes Dokument gefunden:<br> http://www.cs.berkeley.edu/~wkahan/JAVAhurt.pdf</p> <p>und siehe da:<br> Java implementiert IEE754 nicht korrekt bzw. vollständig und verrechnet sich dadurch bei Gleitkommazahlberechnungen.</p> <p>BUH!</p> Java rechnet falsch! Sun, 21 Jan 07 21:07:43 Z https://forum.selfhtml.org/self/2007/jan/21/java-rechnet-falsch/1069721#m1069721 https://forum.selfhtml.org/self/2007/jan/21/java-rechnet-falsch/1069721#m1069721 <p>Hallo,</p> <blockquote> <p>System.out.println(1.1 * 100);</p> <p>=> 110.00000000000001</p> </blockquote> <p>Das wird dir vermutlich bei jeder Sprache/Library, die IEE754 verwendet,<br> passieren. Eine Erklärung, die ich auf die Schnelle für genau dein Zahl-<br> Beispiel gefunden habe, gibt es z.B. in der Python-Doku:<br> <a href="http://www.python.org/doc/2.4.4/whatsnew/node9.html" rel="nofollow noopener noreferrer">http://www.python.org/doc/2.4.4/whatsnew/node9.html</a></p> <blockquote> <p>Java implementiert IEE754 nicht korrekt bzw. vollständig und verrechnet sich dadurch bei Gleitkommazahlberechnungen.</p> </blockquote> <p>Ich habe den Artikel nicht gelesen. Möglich, daß Java das nicht tut.<br> (Ich halte es persönlich für eher unwahrscheinlich, aber ok.) Dein<br> Beispiel hat jedenfalls damit nichts zu tun.</p> <blockquote> <p>BUH!</p> </blockquote> <p>...</p> <p>Gruß<br> Slyh</p> Java rechnet falsch! Sun, 21 Jan 07 21:48:21 Z https://forum.selfhtml.org/self/2007/jan/21/java-rechnet-falsch/1069723#m1069723 https://forum.selfhtml.org/self/2007/jan/21/java-rechnet-falsch/1069723#m1069723 <blockquote> <blockquote> <p>Java implementiert IEE754 nicht korrekt bzw. vollständig und verrechnet sich dadurch bei Gleitkommazahlberechnungen.</p> </blockquote> <p>Ich habe den Artikel nicht gelesen. Möglich, daß Java das nicht tut.<br> (Ich halte es persönlich für eher unwahrscheinlich, aber ok.) Dein<br> Beispiel hat jedenfalls damit nichts zu tun.</p> </blockquote> <p>Mein Beispiel hat vielleicht doch damit zutun:<br> Komischerweise ist nämlich die Darstellung von 1,1; 1,1 * 10 und 1,1 * 1000 korrekt - der Fehler hängt also nicht (nur) von der Darstellung bestimmter Zahlen sondern von den ausgeführten arithmetischen Operation ab. Um solche Ungenauigkeiten zu verhindern, sieht IEEE754 eine Rundung der Werte vor. Schlampt hier Java eventuell genauso, wie bei der Typumwandlung von Gleitkommazahlen zu Ganzzahlen (Nachkommastellen werden einfach abgeschnitten)?</p> Java rechnet falsch! Mon, 22 Jan 07 00:39:09 Z https://forum.selfhtml.org/self/2007/jan/21/java-rechnet-falsch/1069722#m1069722 https://forum.selfhtml.org/self/2007/jan/21/java-rechnet-falsch/1069722#m1069722 <blockquote> <p>Ich habe den Artikel nicht gelesen. Möglich, daß Java das nicht tut.<br> (Ich halte es persönlich für eher unwahrscheinlich, aber ok.) Dein<br> Beispiel hat jedenfalls damit nichts zu tun.</p> </blockquote> <p>ok, überzeugt: mit C/C++ kommt das selbe raus:</p> <p>printf("%.17g\n", 1.1 * 100);</p> <p>=> 110.00000000000001</p> Java rechnet falsch! Sun, 21 Jan 07 22:13:22 Z https://forum.selfhtml.org/self/2007/jan/21/java-rechnet-falsch/1069725#m1069725 https://forum.selfhtml.org/self/2007/jan/21/java-rechnet-falsch/1069725#m1069725 <p>Hallo,</p> <blockquote> <p>Mein Beispiel hat vielleicht doch damit zutun:<br> Komischerweise ist nämlich die Darstellung von 1,1; 1,1 * 10 und 1,1 * 1000 korrekt - der Fehler hängt also nicht (nur) von der Darstellung bestimmter Zahlen sondern von den ausgeführten arithmetischen Operation ab.</p> </blockquote> <p>Wie dem von mir verlinkten Dokument zu entnehmen ist, kann die Ausgabe(!)<br> tatsächlich "korrekt" sein. Die interne Repräsentation von 1.1 bleibt<br> aber nunmal die gleiche.</p> <blockquote> <p>Um solche Ungenauigkeiten zu verhindern, sieht IEEE754 eine Rundung der Werte vor. Schlampt hier Java eventuell genauso, wie bei der Typumwandlung von Gleitkommazahlen zu Ganzzahlen (Nachkommastellen werden einfach abgeschnitten)?</p> </blockquote> <p>Letzteres ist eine Konvention. Das ist keine Schlamperei, sondern<br> Absicht und in jeder mir bekannten Sprache so umgesetzt. (Das hat<br> sicherlich auch damit zu tun, daß aus einem 5/2 bei Ganzzahlrechnung<br> eben auch nicht 3, sondern 2 wird. Und das ist seit den ersten<br> Prozessoren so. Wieso sollte es bei Casts anders sein?)</p> <p>Gruß<br> Slyh</p> Java rechnet falsch! Sun, 21 Jan 07 22:22:24 Z https://forum.selfhtml.org/self/2007/jan/21/java-rechnet-falsch/1069724#m1069724 https://forum.selfhtml.org/self/2007/jan/21/java-rechnet-falsch/1069724#m1069724 <p>Hej,</p> <blockquote> <p>Schlampt hier Java eventuell genauso, wie bei der Typumwandlung von Gleitkommazahlen zu Ganzzahlen (Nachkommastellen werden einfach abgeschnitten)?</p> </blockquote> <p>Wie sollte denn deines Erachtens ein Cast von z.B. double auf int sonst vorgenommen werden? Das was du Schlamperei nennst wird weitläufig als "round-towards-zero" bezeichnet, entspricht AFAIR der IEE_E_754 und ist in der <a href="http://java.sun.com/docs/books/jls/third_edition/html/conversions.html#5.1.3" rel="nofollow noopener noreferrer">Java-Spec</a> so festgelegt.</p> <p>Beste Grüße<br> Biesterfeld</p> <div class="signature">-- <br> Art.1: Et es wie et es<br> Art.2: Et kütt wie et kütt<br> Art.3: Et hätt noch immer jot jejange<br> <a href="http://isamhaddad.de/stuff/kgg.pdf" rel="nofollow noopener noreferrer">Das Kölsche Grundgesetz</a> </div>