Maison > développement back-end > C++ > Pourquoi `std::pow()` produit-il des résultats incorrects avec les mathématiques entières ?

Pourquoi `std::pow()` produit-il des résultats incorrects avec les mathématiques entières ?

Linda Hamilton
Libérer: 2024-12-26 19:11:10
original
461 Les gens l'ont consulté

Why Does `std::pow()` Produce Incorrect Results with Integer Math?

Les mathématiques entières avec std::pow() donnent des résultats incorrects

Dans l'extrait de code fourni :

int i = 23;
int j = 1;
int base = 10;
int k = 2;
i += j * pow(base, k);
std::cout << i << std::endl;
Copier après la connexion

le résultat attendu devrait être "123" mais "122" est à la place imprimé.

Raison de la sortie incorrecte

Le problème réside dans l'utilisation de std::pow(). Cette fonction est conçue pour fonctionner avec des nombres à virgule flottante, qui manquent d'une précision infinie. Bien qu'il s'agisse d'un défaut d'implémentation potentiel dans g 4.7.2 (MinGW, Windows XP), la cause première est la précision limitée des calculs en virgule flottante.

Solution : fonction puissance entière

Pour résoudre ce problème, une fonction puissance entière peut être implémentée pour des résultats précis avec des nombres entiers. En C 11 et versions ultérieures, cette fonction peut être définie comme un constexpr, lui permettant de potentiellement calculer le résultat au moment de la compilation si possible :

constexpr int int_pow(int b, int e)
{
    return (e == 0) ? 1 : b * int_pow(b, e - 1);
}
Copier après la connexion

Forme alternative de queue récursive

Cette fonction peut également être implémentée sous une forme récursive, ce qui est plus efficace dans certains circonstances :

constexpr int int_pow(int b, int e, int res = 1)
{
    return (e == 0) ? res : int_pow(b, e - 1, b * res);
}
Copier après la connexion

En utilisant ces fonctions de puissance entière à la place de std::pow(), le code produira la sortie correcte, "123", sans les problèmes de précision associés aux calculs à virgule flottante.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal