Maison >développement back-end >C++ >Pourquoi `std::pow` donne-t-il des résultats inattendus avec les mathématiques entières ?
Lorsque vous utilisez std::pow pour les mathématiques entières, vous pouvez rencontrer des résultats inattendus. Dans ce scénario, un extrait de code visant à définir i = 23 1 * 10^2 donne 122, et non 123.
Ce comportement découle de la nature à virgule flottante de std::pow, qui manque intrinsèquement d'infini précision. Les implémentations peuvent exacerber ce problème en raison d'implémentations inefficaces.
Pour résoudre ce problème, une fonction puissance entière personnalisée peut être définie. En C 11 et versions ultérieures, une fonction constexpr garantit que le résultat peut être calculé au moment de la compilation :
constexpr int int_pow(int b, int e) { return (e == 0) ? 1 : b * int_pow(b, e - 1); }
Une forme alternative récursive de queue, attribuée à Dan Nissenbaum, permet un calcul plus efficace :
constexpr int int_pow(int b, int e, int res = 1) { return (e == 0) ? res : int_pow(b, e - 1, b * res); }
Ces alternatives fournissent des calculs de puissance entière précis, résolvant le problème rencontré avec std :: pow.
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!