Verstehen der Diskrepanz in der Gleitkomma-Arithmetik zwischen x86 und x64
Im Bereich der Computerprogrammierung der Unterschied in der Art und Weise, wie Gleitkomma-Arithmetik ist Die Verarbeitung zwischen x86- und x64-Architekturen kann zu unerwarteten Ergebnissen führen. Diese Abfrage untersucht eine solche Diskrepanz, insbesondere beim Vergleich zweier Gleitkommawerte in Microsoft Visual Studio 2010-Builds.
Das Problem
Ausführung des folgenden Codeausschnitts in x86 und x64-Builds auf derselben 64-Bit-Maschine zeigen eine Diskrepanz:
float a = 50.0f; float b = 65.0f; float c = 1.3f; float d = a * c; bool bLarger1 = d < b; bool bLarger2 = (a * c) < b;
Der boolesche Wert bLarger1 bleibt in beiden Builds falsch, während bLarger2 in x64 falsch, in x86 jedoch wahr ist. Diese Inkonsistenz wirft Fragen über die zugrunde liegende Mechanik der Gleitkomma-Arithmetik in diesen Architekturen auf.
Die Ursache
Der Kern des Problems liegt in der Auswertung des Ausdrucks:
bool bLarger2 = (a * c) < b;
Die Untersuchung des generierten Assemblercodes für x86 und x64 zeigt einen wesentlichen Unterschied. In x64 erfolgt die Berechnung mit reinen Anweisungen mit einfacher Genauigkeit. Im Gegensatz dazu verwendet x86 die x87-Gleitkommaeinheit, die mit einer höheren Genauigkeit arbeitet (standardmäßig doppelte Genauigkeit).
Die Erklärung
Diese Unterscheidung ergibt sich aus die grundlegenden Unterschiede zwischen der x87-FPU und der x64-SSE-Einheit. Die x87-Einheit verwendet dieselben Anweisungen für Berechnungen mit einfacher und doppelter Genauigkeit, was zu einem gewissen Maß an Ungenauigkeit bei Operationen mit einfacher Genauigkeit führt. Andererseits verwendet die SSE-Einheit unterschiedliche Anweisungen für jede Präzision und gewährleistet so genaue Berechnungen mit einfacher Genauigkeit.
Die Lösung
Um diese Diskrepanz im 32- bit (x86) Build ist es möglich, die x87-Einheit zu zwingen, Berechnungen mit einfacher Genauigkeit durchzuführen, indem das folgende Steuerflag verwendet wird:
_controlfp(_PC_24, _MCW_PC);
Dies führt dazu, dass beide booleschen Variablen (bLarger1 und bLarger2) gesetzt werden auf false in x86- und x64-Builds.
Schlussfolgerung
Die Diskrepanz in der Gleitkomma-Arithmetik zwischen x86 und x64 ergibt sich aus den Unterschieden in den zugrunde liegenden Gleitkomma-Einheiten. Durch das Verständnis dieser Unterschiede und das Ergreifen geeigneter Maßnahmen, wie z. B. das Erzwingen von Berechnungen mit einfacher Genauigkeit in x86, können Programmierer genaue und konsistente Ergebnisse über verschiedene Architekturen hinweg sicherstellen.
Das obige ist der detaillierte Inhalt vonWarum führt Gleitkomma-Arithmetik in x86- und x64-Architekturen zu unterschiedlichen Ergebnissen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!