Calcul en C complètement faux

filou156 -  
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
Configuration: Windows 7 Internet Explorer 8.0

6 réponses

  1. Profil bloqué
     
    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
  2. Groarh Messages postés 706 Statut Membre 185
     
    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
  3. loupius Messages postés 789 Statut Membre 148
     
    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
  4. Profil bloqué
     
    ou encore utiliser une bibliothèque mathématiques spécialisée dans les grands nombres.
    0
    1. loupius Messages postés 789 Statut Membre 148
       
      C'est la raison pour laquelle j'ai mis 'au moins' 2 solutions; on ne pense jamais à tout ;-)
      Bonne nuit.
      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

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