Maison >développement back-end >C++ >Pourquoi `std::pow` produit-il des résultats inattendus avec des entiers en C ?

Pourquoi `std::pow` produit-il des résultats inattendus avec des entiers en C ?

Patricia Arquette
Patricia Arquetteoriginal
2024-12-02 12:57:13113parcourir

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

Explication d'un résultat mathématique entier inattendu à l'aide de std::pow

Dans le code C, l'arithmétique des nombres entiers peut parfois se comporter de manière inattendue lorsqu'elle est combinée avec le flottant- opérations ponctuelles. Considérez l'extrait de code suivant :

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

Ce code génère "122" au lieu du "123" attendu. En effet, std::pow() fonctionne avec des nombres à virgule flottante, qui ne possèdent pas une précision infinie. L'implémentation de std::pow() peut introduire des inexactitudes qui se manifestent dans les opérations sur les entiers.

Solution utilisant la fonction de puissance entière personnalisée

Pour remédier à ce problème, il est conseillé pour définir une fonction puissance entière personnalisée. Cette fonction fournira des calculs entiers précis. En C 11 et versions ultérieures, vous pouvez définir une fonction de puissance entière constexpr :

constexpr int int_pow(int b, int e)
{
    return (e == 0) ? 1 : b * int_pow(b, e - 1);
}

Optimisation des performances

Pour des performances améliorées, vous pouvez utiliser une version récursive de queue de la fonction :

constexpr int int_pow(int b, int e, int res = 1)
{
    return (e == 0) ? res : int_pow(b, e - 1, b * res);
}

Conclusion

En utilisant une fonction de puissance entière personnalisée, vous pouvez effectuer avec précision des calculs d'entiers, en répondant aux limites de précision de l'arithmétique à virgule flottante et en résolvant les résultats inattendus rencontrés avec std::pow() pour les opérations sur les entiers.

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!

Déclaration:
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