Heim >Backend-Entwicklung >C++ >Warum liefert „std::pow()' bei der Ganzzahlberechnung falsche Ergebnisse?

Warum liefert „std::pow()' bei der Ganzzahlberechnung falsche Ergebnisse?

Linda Hamilton
Linda HamiltonOriginal
2024-12-26 19:11:10497Durchsuche

Why Does `std::pow()` Produce Incorrect Results with Integer Math?

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!

Stellungnahme:
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