Hi,
das "Problem" ist so alt wie die binäre Darstellung bzw. die Verarbeitung der Gleitkommazahlen, also seit der Erfindung der Prozessoren / Rechner.
Eine vom Computer verarbeitbare Binärzahl hat nun mal nur eine begrenzte Anzahl Bits zur Verfügung. Innerhalb dieser Anzahl Bits ist nur eine begrenzte Genauigkeit der Berechnung möglich!
Die meisten "Kommazahlen" sind aber garnicht "genau" binär darstellbar!
Daher gibt es bei den Prozessoren diverse (einstellbare) Möglichkeiten, die zwangsläufig fehlerbehaftete Berechnung über Rundung zu korrigieren.
Das führt(e) schon dazu, dass identische Assemblerprogramme nach dem Assemblieren auf verschiedenen Prozessorplatformen zu unterschiedlichen Ergebnissen kamen, weil die Prozessoren nach dem Start das FPU-Control-Word unterschiedlich gesetzt hatten. Dieses Register bestimmt u.a. das Rundungsverhalten und die Genauigkeit der prozessorinternen Berechnung.
Lustig wird es dann, wenn ein Programm das Controlword für eine beabsichtigt genaue Berechnung/Rundung ändert und danach nicht wieder zurücksetzt....
Dann bekommt man unterschiedliche Ergebnisse einer Berechnung, nur weil im bspw. zwischenzeitlich zur Entspannung gezockten Spiels der Programmierer das Controlword geändert und nicht auf den ursprünglichen Wert zurückgesetzt hatte
Das Problem hängt dann nicht einmal in der offensichtlich veränderten Genauigkeit, sondern bspw.in völlig veränderten Programmabläufen aufgrund von Vergleichen :wacko:
Wenn man nach einer Berechnung in einem Programm das Ergebnis so auswertet
und immer ermittelt der Prozessor TRUE dann ist alles schick....
Spielt man zwischendurch Tetris welches das FPU-Control-Word verändert (und nicht wieder zurücksetzt) und danach liefert unser Berechnungsprogramm für die Zeile
infolge anderer berechneter Werte plötzlich FALSE, dann hat man ein nicht unerhebliches Problem.....
Von den "Problemen" bei Wertebereichen der FPU-Register von 80 Bit und dem Speicherbereich eines (single)floats von 32 Bit und eines (double) floats von 64 Bit garnicht zu reden....
Letztendlich bleibt nur übrig, den "genauen" Wertebereich zu definieren bzw. darzustellen!
[autoit]For $i = 2 to 3.5 Step 0.025
ConsoleWrite( stringformat("$i = %f", $i) & @LF)
Next
Voila!
Die Frage bleibt aber, ob der Prozessor richtig rechnet oder das Ergebnis "richtig" dargestellt wird ![]()