Gleitkomma-Diskrepanzen aufgrund der Optimierung: Compiler-Fehler oder intrinsische Präzision
Der bereitgestellte Code, der Gleitkommawerte runden soll, weist Abweichungen auf Verhalten auf verschiedenen Compilern und Optimierungseinstellungen. Diese Diskrepanz ist auf Diskrepanzen bei der Handhabung der Gleitkomma-Präzision während der Optimierung zurückzuführen.
Intel x86-Prozessoren verwenden intern eine erweiterte 80-Bit-Präzision, während Double typischerweise ein 64-Bit-Datentyp ist. Optimierungsstufen beeinflussen, wie häufig Gleitkommawerte im Speicher gespeichert werden, was zu einer Rundung von 80-Bit- auf 64-Bit-Präzision führt.
Um dies zu mildern, kann die gcc-Option -ffloat-store zur Beibehaltung verwendet werden Konsistente Gleitkomma-Ergebnisse über alle Optimierungsstufen hinweg. Alternativ können durch die Verwendung des Long-Double-Typs, der bei gcc normalerweise 80 Bit breit ist, Rundungsprobleme zwischen 80-Bit- und 64-Bit-Genauigkeit vermieden werden.
Gemäß der Man-GCC-Dokumentation ist der -ffloat-store Option:
Do not store floating point variables in registers, and inhibit other options that might change whether a floating point value is taken from a register or memory.
Diese Option ist häufig in Szenarien nützlich, in denen Programme eine genaue Definition von IEEE-Gleitkommazahlen erfordern und auf in gespeicherten Zwischenberechnungen angewiesen sind Variablen.
In x86_64-Builds verwenden Compiler standardmäßig SSE-Register für Float und Double, wodurch die Verwendung erweiterter Genauigkeit entfällt und das betreffende Problem entschärft wird. Die gcc-Compileroption -mfpmath steuert dieses Verhalten.
Das obige ist der detaillierte Inhalt vonWarum kommt es bei der Optimierung zu Abweichungen bei der Gleitkomma-Rundung?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!