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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 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")

  9. #9
    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).

  10. #10
    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

  11. #11
    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
    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).
    Oui j'ai vu la différence j'ai utilisé %.15f pour qu'i n'y est pas plus de 15 chiffres après la virgule et j'ai créé une fonction pour supprimer les zéro inutiles.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
    void SupZeroP(int i)
    {
       int k;    
       char aff_float_tronque[20] ; // declaration d'une chaine de caractere
     
       sprintf ( aff_float_tronque, "%s", LAYOUT.CH[i].text) ; 
     
       int longueur_chaine = (int) strlen ( aff_float_tronque ) - 1 ;// on recupere la longueur de la chaine contenant le float
       // le - 1 permet de ne pas prendre en compte le dernier caractere qui est le caractere de fin de chaine
     
     
       // on fait une boucle pour tester chaque caractere en partan de la fin d'où la decrementation
       for (k = longueur_chaine; k > 0; k-- )
       {
         if ( aff_float_tronque [k] == '0' )
         {
           aff_float_tronque [k] = '\0' ; // si on trouve un 0 sur notre chemin on le remplace par un fin de chaine \0
         }
         else if ( aff_float_tronque [k] == '.' )
         {
           aff_float_tronque [k] = '\0' ; // pareil si il y a qu'une partie entiere on enleve le point puis on break
           break ;
         }
         else
         {
           break ; // si on ne trouve pas de 0 ni de point on break
         }
       }       
       sprintf(LAYOUT.CH[i].text,"%s",aff_float_tronque);
    }
    me reste le problème de savoir si c'est un nombre fini ou pas.

  12. #12
    Expert confirmé

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

  13. #13
    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é

  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
    j'ai trouvé un autre lien http://www.linux-kheops.com/doc/man/...sprintf.3.html

    mais la je trouve vraiment pas la solution

  15. #15
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par totofe Voir le message
    je peux pas y accédé
    Vas-y par la porte : http://www.dinkumware.com/c99.aspx

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