Maison >développement back-end >C++ >Pourquoi `std::pow` donne-t-il des résultats inattendus avec les mathématiques entières ?

Pourquoi `std::pow` donne-t-il des résultats inattendus avec les mathématiques entières ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-03 10:33:11124parcourir

Why Does `std::pow` Give Unexpected Results with Integer Math?

Pourquoi les mathématiques entières avec std::pow produisent des résultats inattendus

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.

Implémentation de la fonction puissance entière

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

Variation récursive de queue

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!

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