Calcul en C complètement faux
filou156
-
loupius Messages postés 789 Statut Membre -
loupius Messages postés 789 Statut Membre -
Bonjour,
Je travaille depuis un certain temps avec C et j'ai un souci. Je calcule un nombre assez grand soit :
4344039185792571909692586446309849. Je l'ai mis sous int et jusque là tout va bien. Je tente alors de le diviser par 24 et oups, j'obtiens une valeur erronée. La réponse devrait être : 181 001 632 741 357 162 903 857 768 596 243.
Le calcul est en int :
int
nbr1 = 0,
nbr2 = 0;
nbr1 = 4344039185792571909692586446309849;
nbr2 = nbr1 / 24;
printf(%d, nbr2); // J'ai essayé %lld sans succès
Merci de m'aider
Je travaille depuis un certain temps avec C et j'ai un souci. Je calcule un nombre assez grand soit :
4344039185792571909692586446309849. Je l'ai mis sous int et jusque là tout va bien. Je tente alors de le diviser par 24 et oups, j'obtiens une valeur erronée. La réponse devrait être : 181 001 632 741 357 162 903 857 768 596 243.
Le calcul est en int :
int
nbr1 = 0,
nbr2 = 0;
nbr1 = 4344039185792571909692586446309849;
nbr2 = nbr1 / 24;
printf(%d, nbr2); // J'ai essayé %lld sans succès
Merci de m'aider
Configuration: Windows 7 Internet Explorer 8.0
6 réponses
-
Bonsoir, quelle est la valeur erronée obtenue ? Attention car le nombre en question dépasse 64 bits, la taille probable de l'int. (en fait , cela dépend de la machine, vérifier cela par printf("La taille d'un int sur cette machine est de %d octets\n",sizeof(int));). Il est donc probable que l'instruction "nbr1= ..." entraine un cast implicite, le compilateur n'affiche-t-il pas un warning ?
Par ailleurs, la division entière par 24 donne
1810016327413571629038577685962
et non
181001632741357162903857768596243
Cordialement, -
Pareil !
Ton nombre est trop grand, il dépasse de la culotte si vous me passez l'expression. Faut utiliser un type plus gros, genre long, ou te faire un type perso. -
Sur une machine standard 32bits, avec gcc et sous Linux, on a:
- 2 octets pour 'short',
- 4 octets pour 'int' ou 'long',
- 8 octets pour 'long long',
8 octets donnent 2^64 soit environ 10^20 et ton nombre à plus de 20 chiffres, c'est râpé.
Il te reste au moins 2 solutions:
- définir ton type comme le dit Groarh,
- changer de langage, par exemple, pour un entier Python n'a pas de limite.
Bonne réflexion. -
ou encore utiliser une bibliothèque mathématiques spécialisée dans les grands nombres.
-
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question -
-