Bug dans programme de calcul de puissance.

Résolu
delcencen -  
mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   -
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 .

2 réponses

  1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 588
     
    bonjour,
    je pense que tu as raison.
    0
  2. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 940
     
    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