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 .
A voir également:
- Bug dans programme de calcul de puissance.
- Test puissance pc - Guide
- Programme demarrage windows - Guide
- Calcul moyenne excel - Guide
- Calcul km marche à pied gratuit - Télécharger - Sport
- Cette action ne peut pas être réalisée car le fichier est ouvert dans un autre programme - Guide
2 réponses
yg_be
Messages postés
24281
Date d'inscription
Statut
Contributeur
Dernière intervention
Ambassadeur
1 585
bonjour,
je pense que tu as raison.
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'
On obtient alors :
Bien entendu si tu utilises des valeurs encore plus grandes, tu peux déclencher un overflow. Tu peux alors utiliser un
Bonne chance
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(
longen 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 longsi 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 longmonte tout de même à 18 446 744 073 709 551 615 ce qui devrait normalement largement te suffire :-)
Bonne chance