Thread Richtig INTen (14 answers)
Opened by bianca at 2009-12-24 09:27

GUIfreund
 2012-01-21 10:14
#155569 #155569
User since
2011-08-08
559 Artikel
BenutzerIn
[default_avatar]
2012-01-20T18:14:29 topeg
Die Probleme tauchen immer auf, wenn Fließkommazahlen in Integer umgewandelt werden sollen. int ist hier nur ein Beispiel. Beim Runden passiert genau das selbe.
Das tritt in deinem Fall nur deshalb nicht auf, da mit Zahlen gearbeitet wird, die nahe an einem Integer sind.

Und selbst wenn die Zahl nahe an einem Integer liegt, heißt das nicht, dass dies die richtige Integer ist. Durch instabile Algorithmen können sich Rundungsfehler gewaltig aufblähen und das Ergebnis unbrauchbar machen. Es sollen dadurch schon Brücken eingestürzt sein.
2012-01-20T18:14:29 topeg
Nimmt man andere Werte, so taucht das Problem auch wieder auf. Deine Form des Rundens ebenfalls ist nicht zuverlässig. Auch dort kann es zu Fehlern kommen, wenn eine Rationale Zahl als Fließkommazahl nicht darstellbar ist. So was kann man umgehen. So ist es möglich einigermaßen Korrekt zu runden, indem man die Genauigkeit der Darstellung erhört. Das habe ich z.B bei meiner Funktion zum Runden gemacht. Ähnliches kann man auch bei der von bianca angesprochenen Multiplikation mit Integerumwandlung machen.

Gäbe es einfache Lösungen die Schwächen des Computers zu umgehen, so würde ich sie nutzen.

... und die Hardware-Hersteller auch.
2012-01-20T18:14:29 topeg
Aber einfache Lösungen gibt es nur in Spezialfällen. Generell muss man größeren Aufwand treiben.

EDIT:
Wobei int($wert*100) ein solcher Spezialfall ist. Da kann man schreiben int($wert*100+0.001) damit werden zu kleine Werte "angehoben". Insofern hast du Recht. Das lässt sich aber nicht so einfach generalisierten.

Du rennst bei mir offene Türen ein. Ich bin mit der Problematik der Genauigkeit von Gleitkommaarithmetik recht gut vertraut. Ein Computer kann nur endlich viele Zahlen exakt darstellen. Man kann mit Computern sehr genau rechnen. Z. B. wurde π (pi) schon sehr genau berechnet. Man muss sich aber vorher (!!!!) überlegen, welche Genauigkeit man benötigt, und sein Programm entsprechend auslegen.
Gruß
GUIfreund

View full thread Richtig INTen