Diskrepanz bei der Gleitkomma-Arithmetik zwischen x86 und x64
In Visual Studio 2010 entsteht ein deutlicher Unterschied in der Gleitkomma-Arithmetik zwischen x86- und x64-Builds entsteht beim Vergleich der Werte bestimmter Ausdrücke. Diese Ungleichheit manifestiert sich im folgenden Code:
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;
x86- und x64-Architekturen behandeln den zweiten Ausdruck, bLarger2, unterschiedlich. Im x86-Build wird bLarger2 als „true“ ausgewertet, während es im x64-Build als „false“ ausgewertet wird. Diese Ungleichheit hat ihren Ursprung in der Berechnung des Ausdrucks (a * c) in Gleitkommaoperationen.
Ursprünge der Ungleichheit
Die Wurzel der Ungleichheit liegt im Unterschied Gleitkommaeinheiten, die von den beiden Architekturen verwendet werden: x87 für x86 und SSE für x64. Der grundlegende Unterschied zwischen den beiden Einheiten ist ihre Präzision. Die x87-Einheit verwendet standardmäßig eine höhere als einfache Genauigkeit (normalerweise doppelte Genauigkeit), während die SSE-Einheit ausschließlich mit einfacher Genauigkeit arbeitet.
Behebung der Diskrepanz
Um das zu beheben Bei Abweichungen kann die Genauigkeit der x87-Einheit manuell so konfiguriert werden, dass sie mit der der SSE-Einheit übereinstimmt. Dies kann in 32-Bit-Code erreicht werden, indem Folgendes ausgeführt wird:
_controlfp(_PC_24, _MCW_PC);
Durch Festlegen der Genauigkeit auf einfache Genauigkeit wird die Auswertung von (a * c) im bLarger2-Ausdruck an die von x64 angepasst Build, was dazu führt, dass sowohl bLarger1 als auch bLarger2 auf false gesetzt werden.
Fazit
Der Unterschied in der Gleitkomma-Arithmetik zwischen x86- und x64-Builds ergibt sich aus den unterschiedlichen Genauigkeitsstufen der x87- und SSE-Gleitkommaeinheiten. Durch die manuelle Steuerung der Präzision der x87-Einheit, um sie an die der SSE-Einheit anzupassen, kann die Diskrepanz beseitigt werden, wodurch eine konsistente Auswertung der Ausdrücke über beide Architekturen hinweg sichergestellt wird.
Das obige ist der detaillierte Inhalt vonWarum unterscheidet sich die Gleitkomma-Arithmetik zwischen x86 und x64 in Visual Studio 2010?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!