Bug dans programme de calcul de puissance.
Résolu/Fermé
delcencen
-
Modifié le 25 janv. 2022 à 16:35
mamiemando Messages postés 33372 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 22 novembre 2024 - 25 janv. 2022 à 16:38
mamiemando Messages postés 33372 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 22 novembre 2024 - 25 janv. 2022 à 16:38
A voir également:
- Bug dans programme de calcul de puissance.
- Test puissance pc - Guide
- Bug yahoo mail - Accueil - Mail
- Calcul moyenne excel - Guide
- Programme demarrage windows 10 - Guide
2 réponses
yg_be
Messages postés
23346
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
24 novembre 2024
Ambassadeur
1 552
15 janv. 2022 à 13:05
15 janv. 2022 à 13:05
bonjour,
je pense que tu as raison.
je pense que tu as raison.
mamiemando
Messages postés
33372
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
22 novembre 2024
7 802
Modifié le 25 janv. 2022 à 16:51
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'
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