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 :

nombre avec 8 chiffres apres la virgule


Sujet :

C

  1. #1
    Membre actif Avatar de snipes
    Inscrit en
    Septembre 2004
    Messages
    547
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 547
    Points : 295
    Points
    295
    Par défaut nombre avec 8 chiffres apres la virgule
    bonjour tout le monde,

    je souhaiterai savoir quel type de donnée attribuer a un nombre ayant 8 chiffre apres la virgule
    j ai essayé le type "long double" mais lors de l affichage les 2 derniers chiffres sont arrondi !! (a l affichage j utilise %Lf ou %Ld ...dans les 2 cas c'est pas bon )

    auriez vous une idée sur le sujet ?

  2. #2
    Invité(e)
    Invité(e)
    Par défaut
    Bonjour,
    En c, les types décimaux sont à virgule flottante on ne peut donc pas leur donner une précision absolue, seulement une précision relative : un flottant simple ou double précision sera plus précis quand il s'approche de zero, mais perd de la précision quand on s'en éloigne.

    voir ici.

    Pour avoir une précision exacte(1), il faut passer aux nombre à virgule fixe, et là, il n'y a rien de standard.

    (1) c'est à dire un nombre fixe de chiffres exacts après la virgule

  3. #3
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 395
    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 395
    Points : 23 755
    Points
    23 755
    Par défaut
    Citation Envoyé par mabu Voir le message
    En c, les types décimaux sont à virgule flottante on ne peut donc pas leur donner une précision absolue, seulement une précision relative : un flottant simple ou double précision sera plus précis quand il s'approche de zero, mais perd de la précision quand on s'en éloigne.
    Et pas seulement : certains nombres ne peuvent être codés de manière absolue en binaire.

    Voir ici aussi.

    Ça vaudrait le coup de faire une entrée dans la F.A.Q. ...

  4. #4
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 948
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 948
    Points : 5 662
    Points
    5 662
    Par défaut
    Hei,
    Citation Envoyé par Obsidian Voir le message
    Et pas seulement : certains nombres ne peuvent être codés de manière absolue en binaire.

    Voir ici aussi.

    Ça vaudrait le coup de faire une entrée dans la F.A.Q. ...
    Je dirais même plus : la plupart des nombres ne sont pas représentables exactement.

  5. #5
    Membre actif Avatar de snipes
    Inscrit en
    Septembre 2004
    Messages
    547
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 547
    Points : 295
    Points
    295
    Par défaut
    Je pense avoir trouvé mon bonheur - > GMP : http://gmplib.org/
    Merci pour les infos les amis

  6. #6
    Membre actif Avatar de snipes
    Inscrit en
    Septembre 2004
    Messages
    547
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 547
    Points : 295
    Points
    295
    Par défaut
    Autre alternative : float -> %.8f

  7. #7
    Invité(e)
    Invité(e)
    Par défaut
    Citation Envoyé par snipes Voir le message
    Autre alternative : float -> %.8f
    Ceci affiche bien 8 chiffres après la virgule, mais leur précision n'est pas donnée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #include <stdio.h>
    int main(void)
    {
        float f, f_;
        f = 0.f;
        f_ = .00000001f;
     
        printf("%.8f, %.8f\n", f, f+f_);
     
        f = 1e9;
        printf("%.8f, %.8f\n", f, f+f_);
     
        return 0;
    }
    Affiche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    0.00000000, 0.00000001
    1000000000.00000000, 1000000000.00000000
    Le résultat du second calcul est faux, on plutôt n'est pas suffisamment précis

  8. #8
    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 916
    Points
    17 916
    Billets dans le blog
    2
    Par défaut
    euh...

    Ne confond pas précision affichage et précision nombre...

    Que veux dire (et as-tu vraiment besoin ???) d'une précision de 10^-18 ????

    Quelle est la quantité mesurée ??? Qui va manipuler des milliards au milliardième près ??

    Ca m'étonne toujours ces posts...

  9. #9
    Invité(e)
    Invité(e)
    Par défaut
    Citation Envoyé par souviron34 Voir le message
    Quelle est la quantité mesurée ??? Qui va manipuler des milliards au milliardième près ??
    Pardon, mon exemple n'était pas judicieux , je pense m'être fait abusé par mon compilateur...

    Plus rigoureusement :

    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
    #include <stdio.h>
    int main(void)
    {
        float f, f_delta, f_sum;
        f_delta = .00000001f;
     
        f = .0625;
        f_sum = f + f_delta;
        printf("%.8f, %.8f\n", f, f_sum);
     
        f = .125;
        f_sum = f + f_delta;
        printf("%.8f, %.8f\n", f, f_sum);
     
        f = .25;
        f_sum = f + f_delta;
        printf("%.8f, %.8f\n", f, f_sum);
     
        return 0;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    0.06250000, 0.06250001 // OK
    0.12500000, 0.12500001 // OK
    0.25000000, 0.25000000 // PAS OK
    Une erreur sur le type float arrive assez vite non ?

    Et si on affiche plus de chiffres après la virgule :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    0.062500000000000, 0.062500007450581
    0.125000000000000, 0.125000014901161
    0.250000000000000, 0.250000000000000
    Pour résumer, si on veut une précision exacte sur un nombre donné de chiffres après la virgule, on ne doit pas utiliser de type flottant.

    Ne confond pas précision affichage et précision nombre...
    Effectivement, à mon avis, il y a confusion sur le termes.

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par snipes Voir le message
    bonjour tout le monde,

    je souhaiterai savoir quel type de donnée attribuer a un nombre ayant 8 chiffre apres la virgule
    j ai essayé le type "long double" mais lors de l affichage les 2 derniers chiffres sont arrondi !! (a l affichage j utilise %Lf ou %Ld ...dans les 2 cas c'est pas bon )

    auriez vous une idée sur le sujet ?
    S'agissant d'un nombre réel, la représentation interne utilisée en informatique (signe + mantisse + exposant) est une approximation (sinon, il faudrait un nombre infini de bits). La précision varie selon le type et l'implémentation.

    Bien que ce ne soit pas exigé par la norme, généralement, double est plus précis que float.

    Ensuite, on peut demander à la fonction d'affichage d'être plus ou moins précise.
    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
     
    #include <stdio.h>
     
    int main (void)
    {
       {
          float x = 1.0 / 3;
          printf ("x = %.8f\n", x);
       }
       {
          double x = 1.0 / 3;
          printf ("x = %.8f\n", x);
       }
       return 0;
    }
    Avec MinGW sur Vista SP1 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    x = 0.33333334
    x = 0.33333333
     
    Process returned 0 (0x0)   execution time : 0.028 s
    Press any key to continue.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 21/04/2008, 16h00
  2. Représentation d'un nombre avec 'n' chiffres apres la virgule
    Par Contractofoued dans le forum MATLAB
    Réponses: 5
    Dernier message: 29/11/2007, 13h35
  3. calcule de PI avec nombre préci de chiffres aprés la virgule!
    Par do_key_120 dans le forum Algorithmes et structures de données
    Réponses: 12
    Dernier message: 17/10/2007, 22h58
  4. Variable nombre : arrondir à 5 chiffres après la virgule
    Par micatmidog dans le forum Général Python
    Réponses: 7
    Dernier message: 21/12/2005, 10h03
  5. Pourcentage avec deux chiffres après la virgule
    Par Oluha dans le forum Langage SQL
    Réponses: 7
    Dernier message: 29/03/2005, 13h47

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