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
Libérer: 2024-12-03 10:33:11
original
131 Les gens l'ont consulté

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);
}
Copier après la connexion

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);
}
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal