Heim > Artikel > Backend-Entwicklung > Warum führt mein Gleitkomma-Rundungscode bei aktivierten Compiler-Optimierungen zu unterschiedlichen Ergebnissen?
Gleitkomma-Rundungsunterschiede bei aktivierter Optimierung: Ein Compiler-Fehler oder ein Optimierungsdilemma?
Gleitkommaberechnungen können oft unerwartetes Verhalten zeigen, insbesondere wenn Compileroptimierungen sind aktiviert. Betrachten Sie das folgende Code-Snippet:
#include <cstdlib> #include <iostream> #include <cmath> double round(double v, double digit) { double pow = std::pow(10.0, digit); double t = v * pow; double r = std::floor(t + 0.5); return r / pow; } int main() { std::cout << round(4.45, 1) << std::endl; std::cout << round(4.55, 1) << std::endl; }
Erwartete Ausgabe:
4.5 4.6
Wenn dieser Code jedoch mit g mit Optimierungen (O1 – O3) kompiliert wird, sieht die Ausgabe wie folgt aus:
4.5 4.5
Ursache der Ungleichheit:
Diese Inkonsistenz ist auf die Tatsache zurückzuführen, dass x86-Prozessoren intern eine erweiterte 80-Bit-Präzision für Gleitkommaberechnungen verwenden. Double-Variablen sind jedoch normalerweise 64 Bit breit. Wenn Gleitkommawerte von den CPU-Registern im Speicher gespeichert werden, werden sie von 80-Bit-Präzision auf 64-Bit-Präzision gerundet. Diese Rundung kann zu geringfügigen Fehlern führen.
Auswirkungen der Optimierungsstufen:
Unterschiedliche Optimierungsstufen können sich auf die Häufigkeit auswirken, mit der Gleitkommawerte im Speicher gespeichert werden. Bei höheren Optimierungsstufen kommt dies häufiger vor. Dadurch wird der Rundungsfehler stärker ausgeprägt.
Lösungen:
Weitere Überlegungen:
Das obige ist der detaillierte Inhalt vonWarum führt mein Gleitkomma-Rundungscode bei aktivierten Compiler-Optimierungen zu unterschiedlichen Ergebnissen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!