Heim >Backend-Entwicklung >C++ >Warum führt Ganzzahlberechnung mit „pow()' zu falschen Ergebnissen in C?

Warum führt Ganzzahlberechnung mit „pow()' zu falschen Ergebnissen in C?

DDD
DDDOriginal
2024-12-04 22:58:11833Durchsuche

Why Does Integer Math with `pow()` Produce Incorrect Results in C  ?

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!

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