Heim > Backend-Entwicklung > C++ > Warum führt die Gleitkomma-Arithmetik zwischen x86- und x64-Architekturen zu unterschiedlichen Ergebnissen?

Warum führt die Gleitkomma-Arithmetik zwischen x86- und x64-Architekturen zu unterschiedlichen Ergebnissen?

Barbara Streisand
Freigeben: 2024-11-03 03:12:29
Original
978 Leute haben es durchsucht

Why does floating-point arithmetic produce different results between x86 and x64 architectures?

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

Diskrepanzen:

  • x86 Build: Variable bLarger1 ist falsch (sowohl d als auch b sind auf 65,0 gesetzt), während bLarger2 wahr ist.
  • x64 Build: Sowohl bLarger1 als auch bLarger2 sind falsch.

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

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!

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