Heim >Backend-Entwicklung >C++ >Warum liefert „std::pow' bei der Ganzzahlberechnung unerwartete Ergebnisse?
Bei der Verwendung von std::pow für die Ganzzahlberechnung kann es zu unerwarteten Ergebnissen kommen. In diesem Szenario führt ein Codeausschnitt, der i = 23 1 * 10^2 festlegen soll, zu 122 und nicht zu 123.
Dieses Verhalten ist auf die Gleitkomma-Natur von std::pow zurückzuführen, die von Natur aus keine Unendlichkeit aufweist Präzision. Implementierungen können dieses Problem durch ineffiziente Implementierungen verschärfen.
Um dieses Problem zu beheben, kann eine benutzerdefinierte Ganzzahl-Potenzfunktion definiert werden. In C 11 und höher stellt eine constexpr-Funktion sicher, dass das Ergebnis zur Kompilierungszeit berechnet werden kann:
constexpr int int_pow(int b, int e) { return (e == 0) ? 1 : b * int_pow(b, e - 1); }
Eine alternative Tail-rekursive Form, die Dan zugeschrieben wird Nissenbaum ermöglicht eine effizientere Berechnung:
constexpr int int_pow(int b, int e, int res = 1) { return (e == 0) ? res : int_pow(b, e - 1, b * res); }
Diese Alternativen bieten genaue ganzzahlige Potenzberechnungen, Behebung des mit std::pow.
aufgetretenen ProblemsDas obige ist der detaillierte Inhalt vonWarum liefert „std::pow' bei der Ganzzahlberechnung unerwartete Ergebnisse?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!