Heim > Backend-Entwicklung > C++ > Hauptteil

Warum unterscheiden sich Gleitkommaergebnisse bei der Optimierung in verschiedenen Compilern?

Susan Sarandon
Freigeben: 2024-11-11 00:10:03
Original
870 Leute haben es durchsucht

Why Do Floating-Point Results Differ With Optimization in Different Compilers?

Unterschiedliche Gleitkomma-Ergebnisse bei der Optimierung: Compiler-Fehler oder erwartetes Verhalten?

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.

Interne Präzision auf Intel x86-Prozessoren

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.

Optimierung und Gleitkommaspeicherung

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.

Lösung des Problems

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.

VS2008 vs. g

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.

Verwendung von -ffloat-store: Empfohlene Vorgehensweise

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.

Zusätzlich Überlegungen

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!

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