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 :

printf et double


Sujet :

C

  1. #1
    Membre éclairé
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    411
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 411
    Par défaut printf et double
    Bonjours,

    j'explique mon problème:
    J'ai une fonction en C qui divise 2 double. ce nombre est ensuite converti en chaine de caractère a l'aide d'un sprintf.
    mais le sprintf de base ne conserve que 6chiffre après la virgule. Je sais que l'on peut en mettre davantage ainsi sprintf(variable,"%9f",le_double); pour 9.
    mais comment faire pour savoir le nombre de chiffre que posède le double après la virgule et comment savoir si la divise donne bien un nombre défini (ex: 4/3).
    merci de m'aider

  2. #2
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par totofe Voir le message
    Bonjours,

    j'explique mon problème:
    J'ai une fonction en C qui divise 2 double. ce nombre est ensuite converti en chaine de caractère a l'aide d'un sprintf.
    mais le sprintf de base ne conserve que 6chiffre après la virgule. Je sais que l'on peut en mettre davantage ainsi sprintf(variable,"%9f",le_double); pour 9.
    mais comment faire pour savoir le nombre de chiffre que posède le double après la virgule et comment savoir si la divise donne bien un nombre défini (ex: 4/3).
    merci de m'aider
    Regarde %g pour ton premier probleme. Pour le second, il faudrait me l'expliquer plus en detail.

  3. #3
    Membre éclairé
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    411
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 411
    Par défaut
    le 2eme problème c'est que l'on peut pas afficher par exemple 1/3 par ce que ca donne 0.333333333... indéfiniment. donc comment savoir si la division donne un nombre que l'on peut définir ou non.

    Merci

  4. #4
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 391
    Par défaut
    Ça, c'est plus un problème mathématique qu'un problème de langage...
    C'est le genre de chose qu'on rencontre dans des programmes de calcul formel...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 391
    Par défaut
    Comme conjecture, je dirais que si le numérateur n'est pas "divisible" par le dénominateur et que celui-ci n'est pas un multiple de puissances de 2 et de 5 (les deux nombres qui composent la base 10), alors le quotient de la division aura un nombre infini de chiffres.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  6. #6
    Membre éclairé
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    411
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 411
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Comme conjecture, je dirais que si le numérateur n'est pas "divisible" par le dénominateur et que celui-ci n'est pas un multiple de puissances de 2 et de 5 (les deux nombres qui composent la base 10), alors le quotient de la division aura un nombre infini de chiffres.
    bien joué!!

    j'y aurais jamais pensé

    Regarde %g pour ton premier probleme. Pour le second, il faudrait me l'expliquer plus en detail.
    je trouve pas :/

    j'ai essayé:
    le_float=0.36598412
    printf("%g",le_float);

    me donne 0.3659

  7. #7
    Membre éclairé
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    411
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 411
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Comme conjecture, je dirais que si le numérateur n'est pas "divisible" par le dénominateur et que celui-ci n'est pas un multiple de puissances de 2 et de 5 (les deux nombres qui composent la base 10), alors le quotient de la division aura un nombre infini de chiffres.
    tu pourrais me le réécrire en langage c?

    d'après ce que je comprend pour une division de a/b il faut que
    a modulo b !=0
    et que racine carré de b ne soit pas un entier
    et que racine 5eme de b ne soit pas un entier
    pour que la fraction ne donne pas un nombre fini.
    c'est bien ca?

  8. #8
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 391
    Par défaut
    Non, ce n'est pas ça.

    En fait, il faut que b ne puisse pas être exprimé sous la forme 2**n * 5**m (où ** signifie élévation à la puissance). Mais j'ignore comment savoir ça sans factoriser le nombre, et factoriser un nombre, c'est long (complexité exponentielle), c'est même pour ça qu'on l'utilise en cryptographie...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  9. #9
    Membre très actif
    Avatar de buggen25
    Ingénieur développement logiciels
    Inscrit en
    Août 2008
    Messages
    554
    Détails du profil
    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Août 2008
    Messages : 554
    Par défaut
    Citation Envoyé par totofe Voir le message
    bien joué!!

    j'ai essayé:
    le_float=0.36598412
    printf("%g",le_float);

    me donne 0.3659
    on peut aussi faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    le_float=0.36598412
    printf("%.4f",le_float);

  10. #10
    Membre éclairé
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    411
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 411
    Par défaut
    Citation Envoyé par buggen25 Voir le message
    on peut aussi faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    le_float=0.36598412
    printf("%.4f",le_float);
    lol
    oui je sais, mais justement je veux pas qu'il affiche ca
    je veux qu'il affiche le nombre sans arrondi.


    je suis en train d'essayé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("%.*f",longueur,le_float);
    mais comment connaitre la taille du float?
    il n'existe pas de strlen pou les float je suppose

  11. #11
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par totofe Voir le message
    je trouve pas :/

    j'ai essayé:
    le_float=0.36598412
    printf("%g",le_float);

    me donne 0.3659
    Tu as regarde la doc de %g?

  12. #12
    Membre éclairé
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    411
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 411
    Par défaut
    Citation Envoyé par Jean-Marc.Bourguet Voir le message
    Tu as regarde la doc de %g?
    j'ai chercher sur le net et j'ai trouvé ce lien http://membres.lycos.fr/dancel/c/c60_10.htm mais ça m'aide pas beaucoup...

    si tu as un meilleurs liens ca m'intéresserais pas mal

  13. #13
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145

  14. #14
    Membre éclairé
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    411
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 411
    Par défaut
    Citation Envoyé par Jean-Marc.Bourguet Voir le message
    je peux pas y accédé

  15. #15
    Membre éclairé
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    411
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 411
    Par défaut
    j'ai trouvé un autre lien http://www.linux-kheops.com/doc/man/...sprintf.3.html

    mais la je trouve vraiment pas la solution

  16. #16
    Membre expérimenté
    Inscrit en
    Décembre 2003
    Messages
    272
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 272
    Par défaut
    Citation Envoyé par Médinoc
    Comme conjecture, je dirais que si le numérateur n'est pas "divisible" par le dénominateur et que celui-ci n'est pas un multiple de puissances de 2 et de 5 (les deux nombres qui composent la base 10), alors le quotient de la division aura un nombre infini de chiffres.
    C'est juste. Il suffit de noter l'équivalence entre "avoir un nombre fini de chiffres" et "s'écrire n/10^k".
    Au détail près que ce n'est pas "n'est pas divisible" mais "sans facteur commun". Une fraction irréductible, quoi.

    Citation Envoyé par Médinoc Voir le message
    Non, ce n'est pas ça.

    En fait, il faut que b ne puisse pas être exprimé sous la forme 2**n * 5**m (où ** signifie élévation à la puissance). Mais j'ignore comment savoir ça sans factoriser le nombre, et factoriser un nombre, c'est long (complexité exponentielle), c'est même pour ça qu'on l'utilise en cryptographie...
    Tu n'as pas besoin de factoriser b.
    Tu divises b par 2 tant que c'est possible, puis par 5 tant que c'est possible. Et tu testes si le résultat est 1.

  17. #17
    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
    Citation Envoyé par totofe Voir le message
    le 2eme problème c'est que l'on peut pas afficher par exemple 1/3 par ce que ca donne 0.333333333... indéfiniment. donc comment savoir si la division donne un nombre que l'on peut définir ou non.

    Merci
    Entre autres choses, comme on te l'a dit plus haut, il y a à la base un problème de fond : un nombre et sa représentation/affichage...

    Que 1/3 donne 0.33333333.... c'est du domaine mathématique, cependant ça n'est pas pratique (comment lit-on une infinté ??). Par conséquent, chaque fois que l'on veut écrire (que ce soit sur papier ou sur un écran ou dans une chaîne), un nombre, on doit définir une précision d'écriture.

    Maintenant, de manière informatique, il y a 2 précisions différentes : celle de l'ordinateur (1 nombre flottant de 32 bits, par exemple, suivant la réprésentation utilisée par le langage et/ou l'OS, peut avoir N chiffres significatifs pour la mantisse et M chiffres significatifs pour l'exposant) et celle de l'utilisateur.

    La précision de l'ordinateur est celle permettant la séparation float (32 bits) et double (2*32 bits).

    Mais ce n'est pas celle qui nous préoccupe ici.

    Là tu ne cherches qu'une précision à l'affichage.

    C'est donc soit à toi de le décider, soit tu laisses le choix a compilo / bibliothèque / langage / défaut.

    Si tu laisses le choix au compilo etc.., en C il suffit d'écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf ( "%g", nombre);
    pour un double ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf ( "%f", nombre);
    pour un float.

    Maintenant, si toi tu veux décider de la précision d'affichage, il faut donner le nombre total de digits et le nombre de chiffres après la virgule que tu tolères (exemple "%10.4f" correspondra à un nombre ayant au maximum 10 chiffres (y compris le . et le signe) et au maximum 4 chiffres apès la virgule. 1/3 s'écrira donc avec ce format d'affichage "0.3333")

  18. #18
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par souviron34 Voir le message
    Si tu laisses le choix au compilo etc.., en C il suffit d'écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf ( "%g", nombre);
    pour un double ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf ( "%f", nombre);
    pour un float.
    Les deux sont utilisables pour les doubles de meme que lf et lg -- il n'y a pas moyen de passer des floats a une fonction variadique.

    %g choisi entre %f ou un %e de maniere plus ou moins intelligente, et supprime les 0 finaux (il y a des algos qui permettent de limiter le nombre de chiffres ecrit a ce qui est necessaire pour relire sans perte de precision, mais ce n'est pas ce qu'utilise %g).

  19. #19
    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
    Citation Envoyé par Jean-Marc.Bourguet Voir le message
    Les deux sont utilisables pour les doubles de meme que lf et lg -- il n'y a pas moyen de passer des floats a une fonction variadique.

    %g choisi entre %f ou un %e de maniere plus ou moins intelligente
    Absolument, mais vu la question, ma réponse était basique

  20. #20
    Membre éclairé
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    411
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 411
    Par défaut
    Citation Envoyé par Ulmo Voir le message
    Tu n'as pas besoin de factoriser b.
    Tu divises b par 2 tant que c'est possible, puis par 5 tant que c'est possible. Et tu testes si le résultat est 1.

    Mais avant de faire cette manipulation il faut déjà s'assurer que b ne divise pas a et que a/b et bien une division irréductible. je me trompe?
    Comment écrire la division sous forme irréductible? il faut testé si tout les nombres 1er les divise?? ça semble être très couteux en temps...

    Merci

Discussions similaires

  1. Jeu du devin: printf affiche mes phrases en double
    Par johnny3 dans le forum Débuter
    Réponses: 13
    Dernier message: 15/04/2009, 22h11
  2. les accents et printf
    Par remi77 dans le forum C
    Réponses: 5
    Dernier message: 07/07/2003, 20h53
  3. String -> long double (_strlold ?)
    Par haypo dans le forum C
    Réponses: 7
    Dernier message: 25/07/2002, 20h22
  4. Réponses: 3
    Dernier message: 12/06/2002, 21h15
  5. fonction printf
    Par ydeleage dans le forum C
    Réponses: 7
    Dernier message: 30/05/2002, 11h24

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