Heim > Backend-Entwicklung > C++ > Hauptteil

Warum unterscheiden sich die Ergebnisse der Gleitkomma-Arithmetik zwischen x86- und x64-Builds in MS VS 2010?

Patricia Arquette
Freigeben: 2024-10-31 19:36:02
Original
715 Leute haben es durchsucht

Why Do Floating-Point Arithmetic Results Differ Between x86 and x64 Builds in MS VS 2010?

Gleitkomma-Arithmetik-Diskrepanzen zwischen x86 und x64 in MS VS 2010

In Microsoft Visual Studio 2010 weisen Gleitkomma-Rechenoperationen Diskrepanzen auf zwischen x86- und x64-Builds, auch wenn sie auf demselben 64-Bit-Computer ausgeführt werden. Dies wird im folgenden Codeausschnitt deutlich:

<code class="c++">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;</code>
Nach dem Login kopieren

Die boolesche Variable bLarger1 ist durchweg falsch, wobei d in beiden Builds auf 65,0 gesetzt ist. Allerdings ist bLarger2 für x64 falsch, für x86 jedoch wahr.

Der Übeltäter: x87 vs. SSE

Die Diskrepanz ergibt sich aus der Tatsache, dass der x86-Build x87 verwendet Gleitkommaeinheit (FPU), während der x64-Build die Einheit Streaming SIMD Extensions (SSE) verwendet. Der Unterschied liegt in der Präzision der Berechnungen.

Die x87-FPU führt Berechnungen standardmäßig mit doppelter Genauigkeit durch, auch wenn Werte mit einfacher Genauigkeit verarbeitet werden. Die SSE-Einheit hingegen führt Berechnungen mit reiner einfacher Genauigkeit durch. Daher sind x87-Berechnungen etwas genauer als SSE-Berechnungen.

In diesem Fall führt die erhöhte Präzision der x87-FPU zu einem Rundungsfehler, der dazu führt, dass d etwas weniger als 65,0 beträgt. Dies macht bLarger2 für x86 falsch. Im Gegensatz dazu liefert die SSE-Berechnung in x64 einen genaueren Wert für d, was zu einem echten Wert für bLarger2 führt.

Workaround für x86

Um den x86-Build zu erzwingen Um Berechnungen mit einfacher Genauigkeit durchzuführen, kann die folgende Zeile hinzugefügt werden:

<code class="c++">_controlfp(_PC_24, _MCW_PC);</code>
Nach dem Login kopieren

Dadurch wird das Gleitkomma-Steuerwort so eingestellt, dass alle Berechnungen mit einfacher Genauigkeit durchgeführt werden. Mit dieser Änderung werden sowohl bLarger1 als auch bLarger2 für x86- und x64-Builds auf „false“ gesetzt.

Fazit

Die Diskrepanz in der Gleitkomma-Arithmetik zwischen x86 und x64 Builds in MS VS 2010 ergeben sich aus dem Unterschied zwischen der x87-FPU und der SSE-Einheit. Die höhere Präzision der x87-FPU führt zu leicht unterschiedlichen Werten im Vergleich zu den echten Single-Precision-Berechnungen der SSE-Einheit. Durch das Erzwingen von Berechnungen mit einfacher Genauigkeit auf x86 können Entwickler dieses Problem entschärfen und konsistente Ergebnisse auf verschiedenen Plattformen sicherstellen.

Das obige ist der detaillierte Inhalt vonWarum unterscheiden sich die Ergebnisse der Gleitkomma-Arithmetik zwischen x86- und x64-Builds in MS VS 2010?. 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