Heim > Backend-Entwicklung > C++ > Warum erzeugt „std::pow' unerwartete Ergebnisse mit Ganzzahlen in C?

Warum erzeugt „std::pow' unerwartete Ergebnisse mit Ganzzahlen in C?

Patricia Arquette
Freigeben: 2024-12-02 12:57:13
Original
183 Leute haben es durchsucht

Why Does `std::pow` Produce Unexpected Results with Integers in C  ?

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

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

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

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!

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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage