IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

problème avec des grands nombres


Sujet :

C

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 25
    Points : 11
    Points
    11
    Par défaut problème avec des grands nombres
    Bonjour à tous,

    Je suis débutant en C et j'utilise CodeBlocks. J'ai un problème avec un programme très simple qui est censé générer des très grands nombres. Or il semble que le compilateur ne puisse pas aller au-delà de 10^9. Je trouve cela bizarre parce que même la stupide calculatrice de Windows permet d'aller jusqu'à 10^9999 !!!
    J'imagine que je dois mal m'y prendre. Auriez-vous une idée ?

    Merci d'avance

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 400
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 400
    Points : 23 776
    Points
    23 776
    Par défaut
    Tu peux déja utiliser le type « long long », qui repoussera de beaucoup les limites. Tu n'es pas obligé, à ton niveau, de t'en tenir au C89.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 25
    Points : 11
    Points
    11
    Par défaut
    Merci beaucoup,
    J'essaye avec long long ça marche jusqu'à 10^18.

    On peut pas faire mieux ? Parce que 10^18 c'est environ factorielle(20), et au-delà il ne sait plus gérer. Si j'ai besoin de factorielle(50) par exemple, je ne peux pas ?

  4. #4
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 923
    Points
    17 923
    Billets dans le blog
    2
    Par défaut
    type double

    sur un 32 bits 10^+- 308, ça te suffit ???

  5. #5
    Membre averti Avatar de uriotcea
    Homme Profil pro
    Ingénieur / physicien
    Inscrit en
    Septembre 2003
    Messages
    1 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur / physicien
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 301
    Points : 444
    Points
    444
    Par défaut
    Bonjour,

    En mettant 'unsigned' tu gagneras un facteur 2, mais tu n'iras pas au dela avec du C classque pour les entiers en tout cas.
    Tu peux aller voire du coté des libraries spécialisée dans ce type de calcul comme GMP http://en.wikipedia.org/wiki/GNU_Mul...cision_Library

  6. #6
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 721
    Points : 31 044
    Points
    31 044
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par lebelge Voir le message
    Bonjour à tous,

    Je suis débutant en C
    salut

    Il te faut alors apprendre les types et leur précision. Tu as
    - char (sur 8 bits) => nombre de -128 à 127 ou de 0 à 255 en unsigned
    - short int (sur 16 bits) => nombre de -32768 à 32767 ou de 0 à 65535 en unsigned
    - long int (sur 32 bits) => nombre de -2147483648 à 2147483647 ou de 0 à 4294967295 en unsigned
    (à noter que mettre "int" tout seul laisse le compilo choisir lui-même short ou long int)
    - long long (sur 64 bits) => nombre de −9223372036854775808 à 9223372036854775807 ou de 0 à 18446744073709551616 en unsigned
    - float (sur 32 bits) => nombre en virgule flottante (donc un codage particulier avec mantisse et exposant) de -3*10^(-38) à 3*10^(38)
    - double (sur 64 bits) => comme float mais sur 64 bits => de -1.5*10^(-308) à 1.5*10^(308)
    - long double (sur 80 bits) => comme float => de -3*10^(-4932) à 3*10^(4932)
    Les nombres à virgule flottantes sont codés différemment des nombres entiers. Déjà il y a un bit de pris pour le signe (pas d'unsigned possible). Ensuite, le nombre est mis en notation scientifique (un chiffre avant la virgule et ensuite multiplié par une puissance de 10) et ces deux valeurs (nombre décimal et puissance de 10) sont placées dans la zone de codage.

    Ensuite il existe des librairies spécialisées permettant de calculer en précision absolue (car les nombres flottants sont parfois imprécis du fait de la façon dont ils sont codés) ou de calculer avec de super grands nombres. Ces librairies fonctionnent grosso-modo selon le même principe
    - le nombre est découpé en digits et stocké dans un tableau de caractères
    - les calculs se font comme au primaire => chaque digit est calculé avec chaque digit de l'autre nombre
    => donc calculs plus lent mais précision absolue.

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 25
    Points : 11
    Points
    11
    Par défaut
    Merci beaucoup,

    Comment fait-on pour afficher un double ou un long double ?
    J'ai trouvé
    printf("%I64i\n", nombre);
    pour le type long long int

    Mais je n'arrive pas à trouver le format pour double ou long double.

    Merci pour tout en tout cas

  8. #8
    Membre averti Avatar de uriotcea
    Homme Profil pro
    Ingénieur / physicien
    Inscrit en
    Septembre 2003
    Messages
    1 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur / physicien
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 301
    Points : 444
    Points
    444

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 25
    Points : 11
    Points
    11
    Par défaut
    super, merci beaucoup !
    %Le marche très bien

Discussions similaires

  1. Réponses: 0
    Dernier message: 16/11/2012, 08h24
  2. Problème de Math.round avec des grands nombres
    Par Sfaxiano dans le forum Général Java
    Réponses: 2
    Dernier message: 22/09/2012, 12h20
  3. problème avec des grands nombres
    Par lebelge dans le forum Code::Blocks
    Réponses: 1
    Dernier message: 29/07/2011, 06h51
  4. Problème avec BigDecimal et nombres trop grands
    Par tomy29 dans le forum Débuter avec Java
    Réponses: 7
    Dernier message: 31/12/2009, 17h19
  5. Problèmes avec des nombres... que faire ?
    Par sducos81 dans le forum C++
    Réponses: 6
    Dernier message: 21/07/2005, 13h46

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo