Bug dans programme de calcul de puissance.

Résolu/Fermé
delcencen - Modifié le 25 janv. 2022 à 16:35
mamiemando Messages postés 33077 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 18 avril 2024 - 25 janv. 2022 à 16:38
Bonjour,

J'apprend le c++ avec le livre "mini manuel de c++".Dans le chapitre de l'instruction break ,il y a un programme qui calcule les puissance.Avec celui-ci je fais:
Saisissez un nombre entier ou 0 pour terminer : 3
Saisissez l'exposant : 27
3 exposant 27 = 2030534587 (ok)
Saisissez un nombre entier ou 0 pour terminer : 2
Saisissez l'exposant : 32
2 exposant 32 = 0 (pas ok)


Je suppose que c'est une erreur de mémoire due à la limite supérieure de la capacité du type
int
(2 147 483 647) car normalement
2 ^ 32 =4 294 967 296

#include <iostream>

using namespace std;

int main (){
    // Déclaration et initialisation des variables
    int n, exp, puiss=1;
    // Boucle while tant que vrai
    while(1)
    {
        // Saisie d'un nombre entier n
        cout << "Saisissez un nombre entier ou 0 pour terminer : ";
        cin >> n;
        // Test du nombre entier saisi, si il est égal à 0 alors arrêt
        if (n == 0) break;
        // Saisie de l'exposant exp
        cout << "Saisissez l'exposant : ";
        cin >> exp;
        // Boucle pour mettre le nombre entier n saisi à la puissance exp
        for (int i = 1; i <= exp; ++i)
            // Calcul de la variable puiss
            puiss *= n;
        // Affichage du résultat
        cout << n << " exposant " << exp << " = " << puiss << endl;
        // Réinitialisation de la variable puiss pour le calcul suivant
        puiss = 1;
    }
    return 0;
}


Merci de votre aide .

EDIT: Précision du langage dans la coloration syntaxique, voir le tuto https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code .
A voir également:

2 réponses

yg_be Messages postés 22698 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 18 avril 2024 1 471
15 janv. 2022 à 13:05
bonjour,
je pense que tu as raison.
0
mamiemando Messages postés 33077 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 18 avril 2024 7 748
Modifié le 25 janv. 2022 à 16:51
Bonjour,

Ce n'est pas une erreur mémoire (car sinon le programme planterait, mais plutôt un overflow. La solution la plus simple consiste à utiliser un type plus large qu'
int
, par exemple
long int
(
long
en abrégé) :

#include <iostream>

using namespace std;

int main (){
    // Déclaration et initialisation des variables
    int n, exp; 
    long puiss=1;
    // Boucle while tant que vrai
    while(1)
    {
        // Saisie d'un nombre entier n
        cout << "Saisissez un nombre entier ou 0 pour terminer : ";
        cin >> n;
        // Test du nombre entier saisi, si il est égal à 0 alors arrêt
        if (n == 0) break;
        // Saisie de l'exposant exp
        cout << "Saisissez l'exposant : ";
        cin >> exp;
        // Boucle pour mettre le nombre entier n saisi à la puissance exp
        for (int i = 1; i <= exp; ++i)
            // Calcul de la variable puiss
            puiss *= n;
        // Affichage du résultat
        cout << n << " exposant " << exp << " = " << puiss << endl;
        // Réinitialisation de la variable puiss pour le calcul suivant
        puiss = 1;
    }
    return 0;
}


On obtient alors :

(mando@silk) (~) $ g++ toto.cpp && ./a.out 
Saisissez un nombre entier ou 0 pour terminer : 2
Saisissez l'exposant : 32
2 exposant 32 = 4294967296


Bien entendu si tu utilises des valeurs encore plus grandes, tu peux déclencher un overflow. Tu peux alors utiliser un
long long
, voire un
unsigned long long
si tu ne considères pas les valeurs négatives (voir cette page) mais au delà il n'existe plus de type natifs. Dans le cas du
unsigned long long
monte tout de même à 18 446 744 073 709 551 615 ce qui devrait normalement largement te suffire :-)

Bonne chance
0