Maison >développement back-end >C++ >Pourquoi `std::pow` produit-il des résultats inattendus avec des entiers en 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!