Bug dans programme de calcul de puissance.
Résolu
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:
Je suppose que c'est une erreur de mémoire due à la limite supérieure de la capacité du type
2 ^ 32 =4 294 967 296
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 .
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
-
yg_be Messages postés 23437 Date d'inscription Statut Contributeur Dernière intervention Ambassadeur 1 588
bonjour,
je pense que tu as raison. -
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 exemplelong 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 unlong long
, voire ununsigned 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 duunsigned long long
monte tout de même à 18 446 744 073 709 551 615 ce qui devrait normalement largement te suffire :-)
Bonne chance