Unterschied in der Gleitkomma-Arithmetik zwischen x86 und x64
Beim Ausführen eines identischen Codeabschnitts auf MS VS 2010 für x86- und x64-Architekturen (beide laufen auf einer 64-Bit-Maschine) ergab sich ein bemerkenswerter Unterschied in der Gleitkomma-Arithmetik.
Beachten Sie den folgenden Codeausschnitt:
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;
In x86- und x64-Builds bleibt bLarger1 erhalten false (d ist auf 65,0 gesetzt). Allerdings ist bLarger2 im x64-Build falsch, während es im x86-Build wahr ist.
Die Diskrepanz ergibt sich aus dem Ausdruck bLarger2 = (a * c) < B. Der generierte Code zeigt, dass unter x86 die Auswertung in der x87-Einheit durchgeführt wird, die mit höherer als einfacher Genauigkeit (im Allgemeinen doppelter Präzision) arbeitet, während unter x64 die Auswertung in der x64-Einheit durchgeführt wird, die reine Einzelgenauigkeit ausführt -Präzisionsberechnungen.
Um sicherzustellen, dass die 32-Bit-Einheit Berechnungen mit einfacher Genauigkeit durchführt, kann das folgende Steuerwort festgelegt werden:
_controlfp(_PC_24, _MCW_PC);
Dies führt dazu, dass beide Booleschen Werte auf gesetzt werden false im 32-Bit-Programm.
Das zugrunde liegende Problem ergibt sich aus dem inhärenten Unterschied zwischen den x87- und SSE-Gleitkommaeinheiten. Die x87-Einheit verwendet identische Anweisungen für Typen mit einfacher und doppelter Genauigkeit, während die SSE-Einheit jeweils unterschiedliche Anweisungen verwendet. Folglich kann der Compiler mehr Kontrolle über die Berechnungsgenauigkeit in der SSE-Einheit ausüben.
Insgesamt ergibt sich die Ungleichheit zwischen x86- und x64-Gleitkomma-Arithmetik aus den Betriebsmodi der jeweiligen Gleitkomma-Einheiten. Um ein konsistentes Verhalten sicherzustellen, wird empfohlen, Optionen zu prüfen, um den Compiler dazu zu bewegen, SSE-Anweisungen auch für 32-Bit-Ziele auszugeben.
Das obige ist der detaillierte Inhalt vonWarum unterscheidet sich die Gleitkomma-Arithmetik zwischen x86- und x64-Architekturen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!