Heim > Backend-Entwicklung > C++ > Warum unterscheidet sich die Gleitkomma-Arithmetik zwischen x86- und x64-Architekturen?

Warum unterscheidet sich die Gleitkomma-Arithmetik zwischen x86- und x64-Architekturen?

Patricia Arquette
Freigeben: 2024-11-03 10:05:03
Original
969 Leute haben es durchsucht

Why Does Floating Point Arithmetic Differ Between x86 and x64 Architectures?

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;
Nach dem Login kopieren

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);
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage