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
Freigeben: 2024-12-04 22:58:11
Original
529 Leute haben es durchsucht

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;
Nach dem Login kopieren

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);
}
Nach dem Login kopieren

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);
}
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage