Unterschiedliches Gleitkomma-Ergebnis bei aktivierter Optimierung: Ein tieferer Einblick in das Compiler-Verhalten
Bei der Arbeit mit Gleitkomma-Operationen ist es wichtig, Folgendes zu tun die Nuancen verstehen, die durch Compiler-Optimierungen entstehen können. Wie im bereitgestellten Codeausschnitt gezeigt, können unterschiedliche Optimierungsstufen zu unerwarteten Ergebnissen bei der Präzision von Gleitkommaberechnungen führen.
Untersuchung und Erklärung
Der Code zielt auf das Runden ab ein Gleitkommawert mit doppelter Genauigkeit für eine bestimmte Ziffer. Bei aktivierten Optimierungen in g weichen die Ergebnisse jedoch von der erwarteten Ausgabe ab. Dieses Verhalten ist auf die Tatsache zurückzuführen, dass Intel x86-Prozessoren intern eine erweiterte Genauigkeit (80 Bit) für Gleitkommaberechnungen verwenden. Im Gegensatz dazu belegen Variablen mit doppelter Genauigkeit normalerweise 64 Bit.
Wenn die Optimierung deaktiviert ist (O0), speichert der Compiler Gleitkommawerte im Speicher und stellt so sicher, dass die 80-Bit-Präzision erhalten bleibt. Bei aktivierter Optimierung (O1-O3) nutzt der Compiler jedoch die erweiterte Präzision des Prozessors, indem er Werte in Registern behält. Diese Optimierung kann zu Rundungsfehlern führen, wenn die Werte schließlich wieder im Speicher gespeichert und von der 80-Bit- in die 64-Bit-Genauigkeit konvertiert werden.
Auflösungsoptionen
Zur Abhilfe Für dieses Problem werden die folgenden Lösungen empfohlen:
Weitere Überlegungen:
Bezüglich Visual Studio 2008
Die merkwürdige Beobachtung, dass der Code korrekt ist Die Ergebnisse selbst bei aktivierter /fp:fast-Optimierung in Visual Studio 2008 sind in diesem Zusammenhang ein Beweis für die Zuverlässigkeit des Compilers. Während allgemein empfohlen wird, die Option -ffloat-store für g zu verwenden, scheint Visual Studio 2008 dieses Problem effektiver zu lösen.
Das obige ist der detaillierte Inhalt vonWarum unterscheiden sich Gleitkommaberechnungen bei aktivierter Compileroptimierung?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!