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

  2. #22
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    A nouveau %15g devrait faire ce que tu veux...

    Quand a savoir si une division est exacte ou pas, tu ne peux pas faire la difference a posteriori, il faut le faire sur les donnees, pas sur le resultat.

    En simplifiant un peu, les flottants (float, double, long double) ne sont capables de representer que des rationnels dont le denominateur est une puissance de 2 (et pas tous). Le resultat exact des calculs est arrondi pour le mettre sous cette forme. Donc tous les flottants sont representables exactement en decimal avec un nombre fini de chiffres apres la virgule.

  3. #23
    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
    Quand a savoir si une division est exacte ou pas, tu ne peux pas faire la difference a posteriori, il faut le faire sur les donnees, pas sur le resultat.

    En simplifiant un peu, les flottants (float, double, long double) ne sont capables de representer que des rationnels dont le denominateur est une puissance de 2 (et pas tous). Le resultat exact des calculs est arrondi pour le mettre sous cette forme. Donc tous les flottants sont representables exactement en decimal avec un nombre fini de chiffres apres la virgule.
    Me suis mal exprimer, je voudrai savoir si une division donne bien un nombre fini exemple 1/3 n'est pas fini on aura un arrondi de ce résultat.
    Je voudrais savoir s'il était possible d'identifier ce cas de figure et sans être trop couteux en temps si possible.
    merci

  4. #24
    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
    la fonction fmod et ses dérivées est faite pour ça :

    http://man.developpez.com/man3/fmodf.3.php

    après, à toi d'ajuster la précision..


    Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #define PRECISION 0.0001
     
    if ( fabs(fmod (9.0, 3.0)) < PRECISION )
        fprintf ( stderr, "les valeurs sont égales à la précision de %f\n",PRECISION);
    else
        fprintf ( stderr, "les valeurs diffèrent d'au moins  %f\n",PRECISION);

  5. #25
    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

  6. #26
    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 totofe Voir le message
    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?
    Il me semble que Médinoc supposait la fraction irréductible. Mais tu as raison, il faut d'abord la simplifier.

    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...
    Pour simplifier la fraction, il suffit de trouver le pgcd du numérateur et du dénominateur, ce qui se fait très facilement (et rapidement) avec l'algorithme d'Euclide.

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