Mir wurde gesagt, dass die meisten modernen Computer dem gleichen Gleitkomma-Standard folgen. Bedeutet dies, dass sie alle die gleiche Gleitkomma-Antwort für eine bestimmte mathematische Operation erhalten, wenn die Eingaben gleich sind?
Ich frage, weil ich nach einem RTS-Spiel in einem Netzwerk forsche und Hunderte von Einheitenpositionen synchronisieren, klingt nach einem schlechten Weg.
Wenn ich also nur Eingaben sende, muss ich garantieren, dass alle Clients das gleiche Ergebnis erzielen, indem sie die Simulation von diesen Eingaben aus ausführen.
Ich habe gelesen, dass ältere RTS-Spiele Festkomma-Arithmetik verwendeten, aber ich weiß nicht, ob dies auf modernen Computern noch erforderlich ist, wenn alle denselben Standard einhalten? Mir wurde auch gesagt, dass das Ergebnis des Gleitkommas zwar ungenau ist, aber für dieselbe Eingabe deterministisch ist (was vermutlich bedeutet, dass jeder Computer, der demselben Standard folgt, dasselbe ungenaue Ergebnis erhält?).
Haben Computer immer noch Abweichungen, auch wenn sie dem gleichen Gleitkomma-Standard folgen?
Ich schreibe dieses Spiel in C # und bin mir nicht sicher, ob das wichtig ist. Ich dachte, ich würde es trotzdem erwähnen.
quelle
Antworten:
Leider ja, besonders wenn Sie C # (oder eine andere JIT-kompilierte Sprache) verwenden. Das Problem, das hier auftritt, besteht darin, dass die JIT-Kompilierungsphase auf einigen Prozessorarchitekturen Code erzeugt, der mehr CPU-Register verwendet als auf anderen Architekturen. Dies kann zu Situationen führen, in denen auf einigen Maschinen für bestimmte Vorgänge eine erweiterte Gleitkommapräzision verwendet wird, auf anderen Maschinen jedoch nicht. Dies bedeutet, dass für jede iterative Berechnung mit Doppelwerten die Möglichkeit besteht, unterschiedliche akkumulierte Rundungsfehler zu erzeugen.
Das ist kein hypothetisches Problem, ich habe Erfahrungen aus erster Hand mit solchen Abweichungen in der modernen technischen Simulationssoftware auf mehr oder weniger moderner Hardware. Dieses Problem macht es wirklich schwierig, zuverlässige Regressionstests für komplexe Gleitkommaberechnungen zu erstellen, die auf allen beteiligten Maschinen genau das gleiche Ergebnis liefern.
quelle
FLT_EVAL_METHOD
in ISO C / C ++. Transzendente Funktionen (zBsin
,exp
,log
) sind weitgehend sowohl von dem IEEE Floating-Point - Standard nicht geregelt und Sprachstandards zu programmieren. Ein einfaches Upgrade der Bibliotheksversion (z. B. eine neueglibc
Version) kann zu unterschiedlichen Ergebnissen führen.Gleitkommafehler
Jede Gleitkommazahl akkumuliert Ungenauigkeiten, wenn sie zur Berechnung verwendet wird. Dies ist eine einfache Tatsache bei der Verwendung eines ungenauen Formats zum Berechnen. Die Berechnungen sind auch abhängig von der Reihenfolge der Berechnung. Die Kommutativität kann nicht garantiert werden, dh:
(a + b) + c
kann oder kann nicht dieselbe sein wiea + (b + c)
.Außerdem haben Prozessoren nicht unbedingt die gleiche Mantissenlänge wie der Speicherstandard. Dies kann zu einem interessanten Verhalten führen, da der 32/64/128-Bit-Float gelegentlich so funktioniert, als ob er mehr Bits hätte.
Fixpunktfehler
Allerdings kann die Festkomma-Arithmetik auch Fehler akkumulieren. Der Unterschied besteht darin, dass Festkommazahlen klar sind, welche Genauigkeit verloren geht, und abhängig von den gewählten Operationen Rundungsfehler insgesamt vermeiden können. Sie sind auch kommutativ
(a + b) + c = a + (b + c)
.Welche?
Welche Sie verwenden möchten, hängt ganz davon ab, welche Eigenschaften Sie benötigen.
Gleitkommazahlen:
Festkommazahlen:
quelle
(a + b * c) / d - e
. Mit Ausnahme offensichtlicher Probleme wieNaN
Division durch Null oder Überlauf / Unterlauf kann dieser Ausdruck falsch sein. Hinzu kommt, dass die Impedanz zwischen Speicher und Register in Bezug auf die Genauigkeit und sogar ein einfaches Laden / Speichern aus dem Speicher mit dem "gleichen" Gleitkommawert die Antwort ändert.Es stellt sich die Frage, warum Sie identische Ergebnisse garantieren möchten, da identische Ergebnisse überhaupt keine Garantie dafür geben, dass Ihre Ergebnisse nützlich sind .
Sie könnten einen numerisch instabilen Algorithmus haben, der auf verschiedenen Computern zwei identische, aber völlig unsinnige Ergebnisse liefert. Wenn es Unterschiede gibt, die Ergebnisse jedoch innerhalb von 13 Stellen gleich sind, ist dies viel vertrauenswürdiger.
Es gibt nur sehr wenige Situationen, in denen die Reproduzierbarkeit wirklich wichtig ist: in einer Layout-Engine oder verlustfreie Komprimierung / Dekomprimierung. Die Verwendung von Festpunkten ist sehr wahrscheinlich falsch.
quelle