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>
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>
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!