Ganzzahlberechnung mit pow() führt zu falschen Ergebnissen
Bedenken Sie den folgenden Codeausschnitt:
int i = 23; int j = 1; int base = 10; int k = 2; i += j * pow(base, k); cout << i << endl;
Erwartungsgemäß , sollte dieser Code „123“ ausgeben, aber stattdessen gibt er überraschenderweise „122“ aus. Dieses unerwartete Ergebnis kann Sie verwirren, insbesondere wenn Sie mit g 4.7.2 in einer Windows XP-Umgebung kompilieren.
Der Kern dieser Diskrepanz ist die Tatsache, dass std::pow() dafür ausgelegt ist Gleitkommazahlen. Obwohl diese Gleitkommazahlen praktisch sind, haben sie doch einen Nachteil: eine begrenzte Genauigkeit. Im Fall von std::pow() verarbeitet die Implementierung die Potenzierung möglicherweise nicht mit perfekter Genauigkeit, was zu Rundungsfehlern führt.
Um dieses Problem zu beheben, könnte man die Leistungsfähigkeit von C 11 nutzen und eine eigene Ganzzahl definieren Potenzierungsfunktion:
constexpr int int_pow(int b, int e) { return (e == 0) ? 1 : b * int_pow(b, e - 1); }
Diese benutzerdefinierte int_pow-Funktion ist speziell auf Ganzzahlen zugeschnitten und gewährleistet Genauigkeit Ergebnisse.
Alternativ ist auch ein von Dan Nissenbaum vorgeschlagener schwanzrekursiver Ansatz eine praktikable Lösung:
constexpr int int_pow(int b, int e, int res = 1) { return (e == 0) ? res : int_pow(b, e - 1, b * res); }
Mit diesen verfügbaren Optionen können Sie jetzt sicher die Ganzzahlpotenzierung in Ihrem C anwenden Programme, wodurch falsche Ergebnisse in das Reich der vergessenen Fehler verbannt werden.
Das obige ist der detaillierte Inhalt vonWarum führt Ganzzahlberechnung mit „pow()' zu falschen Ergebnissen in C?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!