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 averti
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 25
    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
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 465
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 465
    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 averti
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 25
    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 confirmé

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

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

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

  5. #5
    Membre éprouvé 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
    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
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 830
    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 830
    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.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

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

    Informations forums :
    Inscription : Juillet 2007
    Messages : 25
    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 éprouvé 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

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

    Informations forums :
    Inscription : Juillet 2007
    Messages : 25
    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