Calcul en C complètement faux

Fermé
filou156 - 13 déc. 2009 à 01:44
loupius Messages postés 697 Date d'inscription dimanche 1 novembre 2009 Statut Membre Dernière intervention 31 décembre 2017 - 13 déc. 2009 à 04:12
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
A voir également:

6 réponses

Profil bloqué
13 déc. 2009 à 01:56
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,
0
Groarh Messages postés 682 Date d'inscription vendredi 1 août 2008 Statut Membre Dernière intervention 28 juin 2015 185
13 déc. 2009 à 02:14
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.
0
loupius Messages postés 697 Date d'inscription dimanche 1 novembre 2009 Statut Membre Dernière intervention 31 décembre 2017 148
13 déc. 2009 à 03:01
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.
0
Profil bloqué
13 déc. 2009 à 03:10
ou encore utiliser une bibliothèque mathématiques spécialisée dans les grands nombres.
0
loupius Messages postés 697 Date d'inscription dimanche 1 novembre 2009 Statut Membre Dernière intervention 31 décembre 2017 148
13 déc. 2009 à 04:12
C'est la raison pour laquelle j'ai mis 'au moins' 2 solutions; on ne pense jamais à tout ;-)
Bonne nuit.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Merci, je vais regarder ça. Pour infos, le int est de 4 octets selon le sizeof.
0
Profil bloqué
13 déc. 2009 à 03:24
Alors c'est que la machine ou le compilateur sont en 32 bits (4 x 8 = 32)
0