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
Patricia ArquetteOriginal
2024-12-02 12:57:13199Durchsuche

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;
}

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!

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