Das bereitgestellte Code-Snippet zeigt eine Diskrepanz in den Gleitkomma-Berechnungsergebnissen bei Verwendung der Optimierung auf verschiedenen Compilern . Unter Visual Studio 2008 und g ohne Optimierung erzeugt der Code die erwartete Ausgabe. Bei aktivierter g-Optimierung (O1 – O3) werden jedoch falsche Ergebnisse angezeigt.
Um die Grundursache dieses Verhaltens zu verstehen, ist es wichtig zu beachten, dass Intel x86-Prozessoren verarbeiten Gleitkommaberechnungen intern mit erweiterter 80-Bit-Präzision. Im Gegensatz dazu hat der doppelte Datentyp in C typischerweise eine Breite von 64 Bit.
Optimierungsstufen beeinflussen, wie oft Gleitkommawerte von der CPU gespeichert werden Erinnerung. Dies kann zu Rundungsfehlern führen, wenn Werte während der Speicherung von 80-Bit-Präzision in 64-Bit-Präzision konvertiert werden.
Um konsistente Gleitkommaergebnisse über alle Optimierungsstufen hinweg sicherzustellen, hat gcc stellt die Option -ffloat-store bereit. Durch die Verwendung dieser Option werden Gleitkommawerte immer im Speicher gespeichert, wodurch Rundungsfehler durch die Registerspeicherung vermieden werden.
Alternativ können Sie den Datentyp long double verwenden, der bei gcc normalerweise eine Breite von 80 Bit hat, kann das Rundungsproblem vollständig beseitigen.
Es ist faszinierend, dass Visual Studio 2008 liefert auch bei aktivierter erweiterter Gleitkommagenauigkeit korrekte Ergebnisse. Dies deutet darauf hin, dass VS2008 Rundung und Optimierung anders handhabt als g.
Die Verwendung von -ffloat-store ist zwar nicht unbedingt erforderlich, wird jedoch beim Targeting empfohlen Systeme, die intern erweiterte Gleitkommagenauigkeit verwenden, um vorhersehbares Verhalten über alle Optimierungsstufen hinweg sicherzustellen.
Bei x86_64-Builds tritt dieses Problem nicht auf, da Compiler standardmäßig SSE-Register für Float und Double verwenden, wodurch die Verwendung einer erweiterten Genauigkeit entfällt. Mit der gcc-Compileroption -mfpmath können Sie dieses Verhalten steuern.
Das obige ist der detaillierte Inhalt vonWarum unterscheiden sich Gleitkommaergebnisse bei der Optimierung in verschiedenen Compilern?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!