Diskrepanzen in der Gleitkomma-Arithmetik: x86 vs. x64
In einem Codeausschnitt mit Gleitkomma-Arithmetik treten Inkonsistenzen zwischen MS VS auf 2010-Builds für x86- und x64-Architekturen. Der Code lautet wie folgt:
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;
Diskrepanzen:
Grundlegendes Problem:
Die Diskrepanz ergibt sich aus dem Ausdruck bool bLarger2 = (a*c) < B;. Es scheint zwar den gleichen Vergleich darzustellen wie bool bLarger1 = d < b, es führt tatsächlich die Multiplikation und den Vergleich getrennt durch.
Unterschied in Gleitkommaeinheiten:
Der Hauptunterschied liegt in den von den beiden verwendeten Gleitkommaeinheiten Architekturen. Die x86-Architektur verwendet die x87-Gleitkommaeinheit, die Berechnungen mit einer höheren Genauigkeit durchführt als mit einfacher Genauigkeit (normalerweise mit doppelter Genauigkeit). Im Gegensatz dazu verwendet die x64-Architektur die SSE-Gleitkommaeinheit, die reine Berechnungen mit einfacher Genauigkeit durchführt.
Auswirkungen auf die Multiplikation:
Im bLarger1-Ausdruck Die Multiplikation von a und c wird durch den Hardware-Multiplikationsbefehl durchgeführt. Diese Anweisung verwendet eine Genauigkeit mit doppelter Genauigkeit, was dazu führt, dass d auf 65,0 gesetzt wird.
Im bLarger2-Ausdruck wird die Multiplikation jedoch aufgrund der Typkonvertierung (a*c) explizit mit einfacher Genauigkeit durchgeführt. Dies führt dazu, dass (a*c) auf 64,999992 gesetzt wird.
x87-Präzisionssteuerung:
Standardmäßig arbeitet die x87-Einheit mit doppelter Genauigkeit. Es ist jedoch möglich, das Gerät mithilfe der Funktion _controlfp dazu zu bewegen, Berechnungen mit einfacher Genauigkeit durchzuführen.
_controlfp(_PC_24, _MCW_PC);
Durch Hinzufügen dieser Zeile zum 32-Bit-Code werden sowohl bLarger1 als auch bLarger2 auf „false“ gesetzt.
Compiler-Optionen:
In neueren Versionen von Visual Studio kann der Compiler SSE-Anweisungen sogar für 32-Bit-Ziele ausgeben. Dies stellt die Konsistenz der Gleitkomma-Arithmetik über verschiedene Architekturen hinweg sicher.
Das obige ist der detaillierte Inhalt vonWarum führt die Gleitkomma-Arithmetik zwischen x86- und x64-Architekturen zu unterschiedlichen Ergebnissen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!