Erklärung des unerwarteten ganzzahligen mathematischen Ergebnisses mit std::pow
In C-Code kann sich die Ganzzahlarithmetik manchmal unerwartet verhalten, wenn sie mit Gleitkommazahlen kombiniert wird. Punktoperationen. Betrachten Sie den folgenden Codeausschnitt:
#include <iostream> #include <cmath> int main() { int i = 23; int j = 1; int base = 10; int k = 2; i += j * pow(base, k); std::cout << i << std::endl; }
Dieser Code gibt „122“ statt der erwarteten „123“ aus. Dies liegt daran, dass std::pow() mit Gleitkommazahlen arbeitet, die keine unendliche Genauigkeit besitzen. Die Implementierung von std::pow() kann zu Ungenauigkeiten führen, die sich in Ganzzahloperationen manifestieren.
Lösung mit benutzerdefinierter Ganzzahl-Potenzfunktion
Um dieses Problem zu beheben, ist es ratsam um eine benutzerdefinierte ganzzahlige Potenzfunktion zu definieren. Diese Funktion liefert präzise Ganzzahlberechnungen. In C 11 und höher können Sie eine constexpr-Integer-Potenzfunktion definieren:
constexpr int int_pow(int b, int e) { return (e == 0) ? 1 : b * int_pow(b, e - 1); }
Leistungsoptimierung
Für eine verbesserte Leistung können Sie eine tail-rekursive Version verwenden des Funktion:
constexpr int int_pow(int b, int e, int res = 1) { return (e == 0) ? res : int_pow(b, e - 1, b * res); }
Fazit
Durch die Verwendung einer benutzerdefinierten Ganzzahlpotenzfunktion können Sie ganzzahlige Berechnungen genau durchführen und so die Genauigkeitsbeschränkungen der Gleitkommaarithmetik und -auflösung beseitigen die unerwarteten Ergebnisse, die mit std::pow() für Ganzzahloperationen auftreten.
Das obige ist der detaillierte Inhalt vonWarum erzeugt „std::pow' unerwartete Ergebnisse mit Ganzzahlen in C?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!