Bug dans programme de calcul de puissance.
Résolu
delcencen
-
mamiemando Messages postés 33723 Date d'inscription Statut Modérateur Dernière intervention - 25 janv. 2022 à 16:38
mamiemando Messages postés 33723 Date d'inscription Statut Modérateur Dernière intervention - 25 janv. 2022 à 16:38
A voir également:
- Bug dans programme de calcul de puissance.
- Test puissance pc - Guide
- Calcul moyenne excel - Guide
- Programme demarrage windows 10 - Guide
- Cette action ne peut pas être réalisée car le fichier est ouvert dans un autre programme - Guide
- Calcul km marche à pied gratuit - Télécharger - Sport
2 réponses
yg_be
Messages postés
23541
Date d'inscription
Statut
Contributeur
Dernière intervention
Ambassadeur
1 583
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