Comprendre les problèmes de précision dans les mathématiques entières avec std::pow
Lors de l'exécution d'opérations arithmétiques sur des nombres entiers avec std::pow(), les programmeurs peuvent rencontrer des résultats inattendus. En effet, std::pow() fonctionne nativement avec des nombres à virgule flottante, ce qui introduit des problèmes potentiels dus à une précision finie.
Considérez l'exemple 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 tente de calculer la valeur de i comme 23 1 * 10^2. Cependant, le résultat est « 122 » au lieu du « 123 » attendu. En effet, std::pow() fonctionne sur des nombres à virgule flottante, ce qui peut entraîner de petites inexactitudes dans le résultat calculé.
Pour résoudre ce problème, il est préférable d'utiliser une fonction pow spécifique aux entiers qui garantit calculs précis basés sur des nombres entiers. Une façon d'y parvenir consiste à créer une fonction pow personnalisée qui effectue une multiplication d'entiers de manière récursive :
constexpr int int_pow(int b, int e) { return (e == 0) ? 1 : b * int_pow(b, e - 1); }
Cette fonction personnalisée garantit des calculs d'entiers précis sans les problèmes de précision potentiels associés à l'arithmétique à 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!