Heim >Backend-Entwicklung >C++ >Warum liefert „std::pow()' bei der Ganzzahlberechnung falsche Ergebnisse?
Ganzzahlberechnung mit std::pow() liefert falsche Ergebnisse
Im bereitgestellten Codeausschnitt:
int i = 23; int j = 1; int base = 10; int k = 2; i += j * pow(base, k); std::cout << i << std::endl;
Die erwartete Ausgabe sollte „123“ sein, stattdessen ist „122“. gedruckt.
Grund für falsche Ausgabe
Das Problem liegt in der Verwendung von std::pow(). Diese Funktion ist für die Arbeit mit Gleitkommazahlen konzipiert, denen es an unendlicher Genauigkeit mangelt. Obwohl es sich dabei um einen potenziellen Implementierungsfehler in g 4.7.2 (MinGW, Windows XP) handelt, ist die Hauptursache die begrenzte Präzision von Gleitkommaberechnungen.
Lösung: Ganzzahlige Potenzfunktion
Um dieses Problem zu lösen, kann eine ganzzahlige Potenzfunktion implementiert werden, um genaue Ergebnisse mit ganzen Zahlen zu erzielen. In C 11 und höher kann diese Funktion als constexpr definiert werden, was ihr ermöglicht, das Ergebnis möglicherweise zur Kompilierungszeit zu berechnen, wenn möglich:
constexpr int int_pow(int b, int e) { return (e == 0) ? 1 : b * int_pow(b, e - 1); }
Alternative Tail-Recursive Form
Diese Funktion kann auch in einer tail-rekursiven Form implementiert werden, was in einigen Fällen effizienter ist Umstände:
constexpr int int_pow(int b, int e, int res = 1) { return (e == 0) ? res : int_pow(b, e - 1, b * res); }
Durch die Verwendung dieser ganzzahligen Potenzfunktionen anstelle von std::pow() erzeugt der Code die korrekte Ausgabe „123“, ohne die Genauigkeitsprobleme, die mit Gleitkommaberechnungen verbunden sind.
Das obige ist der detaillierte Inhalt vonWarum liefert „std::pow()' bei der Ganzzahlberechnung falsche Ergebnisse?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!