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 :

Limitation du nombre de chiffres après la virgule lu


Sujet :

C

  1. #1
    Membre du Club
    Inscrit en
    Octobre 2009
    Messages
    72
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 72
    Points : 42
    Points
    42
    Par défaut Limitation du nombre de chiffres après la virgule lu
    Bonsoir tous le monde,

    Voici donc mon problème, j'ai un fichier qui contient des entiers et des réels, en voulant récupérer les réels j'ai remarqué qu'il me donné pas vraiment le réel que j'attendais, exemple: j'ai 27.4250 il me donne 27.424999.

    je voudrai savoir si il y avais la possibilité de récupéré que 4 chiffres apres la virgule et ainsi pouvoir le manipulé.

    Merci infiniment.

  2. #2
    Membre du Club Avatar de Wotan
    Homme Profil pro
    Inscrit en
    Février 2007
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations forums :
    Inscription : Février 2007
    Messages : 25
    Points : 42
    Points
    42
    Par défaut
    A les joies des nombres à virgules ton problèmes proviens d'un souci de conversion entre ta source et ton code.
    Pourrais tu préciser :
    La nature de ton fichier source (le fichier où sont décrit tes entiers et réels)
    La méthode de conversion
    Le type de la variable dans laquelle tu enregistres ton résultats

  3. #3
    Membre du Club
    Inscrit en
    Octobre 2009
    Messages
    72
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 72
    Points : 42
    Points
    42
    Par défaut
    merci wotan pour ta participation,

    bon mon fichier est un simple fichier text, et pour le type bein c'est du float

  4. #4
    Membre confirmé Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Points : 594
    Points
    594
    Par défaut
    Tu peux nous montrer comment tu lis et sourtout comment tu affiches?

  5. #5
    Membre du Club
    Inscrit en
    Octobre 2009
    Messages
    72
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 72
    Points : 42
    Points
    42
    Par défaut
    ok, voici le code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    fgets(line,1500,pf);
            sscanf(line,"%s %d %d %f %f",s,&m,&n,&i,&j);
            printf("voici ce qui est dans le fichier = %f\n",i);
            printf("voici ce qui est dans le fichier = %f\n",j);
    bon quand j'affiche le contenu de i et j, il y a beaucoup de chiffre apres la virgule, sachant que dans le fichier .txt il y a que 4, et moi je ne veux gardé que ces 4 chiffres.

  6. #6
    Membre confirmé Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Points : 594
    Points
    594
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    printf("voici ce qui est dans le fichier = %.4f\n",i); // j'ai changé en  %.4f
    printf("voici ce qui est dans le fichier = %.4f\n",j); // j'ai changé en  %.4f

  7. #7
    Membre du Club
    Inscrit en
    Octobre 2009
    Messages
    72
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 72
    Points : 42
    Points
    42
    Par défaut
    non justement, je ne veux pas affiché, mais plutot à partir du sscanf ne prendre pas plus de 4 chiffres apres la virgule. Donc toute la partie entière et les 4 chiffres apres la virgule. exemple 27,2222 au lieu de 27,2221999

  8. #8
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 945
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 945
    Points : 5 659
    Points
    5 659
    Par défaut
    Joa,

    Désolé pour toi, mais c'est irréversible : c'est un problème de représentation des réels pour les ordinateurs.

    Il y a je ne sais combien de sujets qui en parlent sur le forum.

    En clair : il est strictement impossible d'avoir une représentation exacte des nombres réels (quels que soient 2 nombres réels différents, il en existe une infinité entre eux ...).

    Si les cons volaient, il ferait nuit à midi.

  9. #9
    Membre du Club
    Inscrit en
    Octobre 2009
    Messages
    72
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 72
    Points : 42
    Points
    42
    Par défaut
    mais ce que je trouve illogique droggo, c'est que quand tu ouvre le fichier tu trouve quatre chiffre apres la virgule, et puis quand tu affiche avec printf tu trouve plus que quatre chiffre.... c'est quoi ces bêtises!!!!!

  10. #10
    Membre confirmé Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Points : 594
    Points
    594

  11. #11
    Membre du Club
    Inscrit en
    Octobre 2009
    Messages
    72
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 72
    Points : 42
    Points
    42
    Par défaut
    merci linuxUser pour les liens, mais je ne vois pas vraiment en quoi la représentation des chiffres peut m'aider à comprendre pourquoi un réel qui est dans un fichier text exemple : 2.5000, peut en fesant un prog en C devenir 2.4999999999, sachant que lors de la création de ce fichier j'ai précisé qu'il ne prend que 4 chiffres apres la virgule.

  12. #12
    Membre éprouvé
    Avatar de Celelibi
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    1 087
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 087
    Points : 1 122
    Points
    1 122
    Par défaut
    Si tu essayes d'écrire 0.1 en binaire tu obtiens :
    0.0001100110011001100110011001100110011001100110011001100110011...

    Autrement dit, pour représenter exactement en binaire le résultat du calcul 1.0/10.0, il te faudrait un nombre infini de bits... Ce qui est impossible.

    Les types float et double tronquent après un certain nombre de bit, c'est tout.
    Donc il se peut que ce que tu as lu ne soit pas ce que tu affiches à cause de la troncature entre temps.

    Si tu veux vraiment être capable de recracher le nombre exact que t'as lu, t'as qu'à le lire en tant que chaîne de caractère et pas en tant que float. Tu vas juste galérer si tu dois effectuer des opérations.
    (Et que se passerait-il si l'opération que tu voulais effectuer était 10.0/3 ?)
    Les vaches ne peuvent PAS voler, quoi qu'elles aient pu vous raconter.

  13. #13
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 677
    Points
    13 677
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Umlist Voir le message
    mais ce que je trouve illogique droggo, c'est que quand tu ouvre le fichier tu trouve quatre chiffre apres la virgule, et puis quand tu affiche avec printf tu trouve plus que quatre chiffre.... c'est quoi ces bêtises!!!!!
    Citation Envoyé par Umlist Voir le message
    merci linuxUser pour les liens, mais je ne vois pas vraiment en quoi la représentation des chiffres peut m'aider à comprendre pourquoi un réel qui est dans un fichier text exemple : 2.5000, peut en fesant un prog en C devenir 2.4999999999, sachant que lors de la création de ce fichier j'ai précisé qu'il ne prend que 4 chiffres apres la virgule.
    Parce qu'il y a une différence entre écrire un nombre avec du texte et le représenter en mémoire.

    Prends un nombre tel que 4.7586.

    Je te donne des allumettes pour le représenter. Tu fais comment pour que ça soit 4.7586 ? Tu vas casser des allumettes pour faire la partie décimale, prendre des allumettes entières pour faire la partie entières. OK.

    Je te demande de refaire une seconde fois ce nombre avec de nouvelles allumettes. Es-tu sûr que tu referas des morceaux qui auront exactement la même taille que la première fois ? Ne risques-tu pas de faire 4.7587 ou encore 4.75861 ou même 4.75860000001 ? Pourtant, tu peux écrire autant de fois que tu veux la chaine "4.7586" et ne (presque ^^) jamais te tromper !

    Ben... c'est un peu pareil avec un ordinateur. "Sorry bro !"

  14. #14
    Membre du Club
    Inscrit en
    Octobre 2009
    Messages
    72
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 72
    Points : 42
    Points
    42
    Par défaut
    lol, thx Bktero, mais je croyais que la machine etait bête et discipliné, tu lui demande de lire une chose, elle s'execute et te donne EXACTEMENT ce dont tu lui a demandé.
    à ton avis, si je prend ces chiffres comme etant des strings puis convertir en float comme l'a dit Celilibi, crois tu qu'elle me donnera exactement les même valeurs?

  15. #15
    Membre actif Avatar de moins1
    Homme Profil pro
    Autre
    Inscrit en
    Février 2013
    Messages
    85
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Autre
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2013
    Messages : 85
    Points : 222
    Points
    222
    Par défaut
    Si tu le lis en chaîne et le transformes en float, tu vas avoir le même résultat. Avec un double peut être que ce serait mieux. Reste que c'est le même principe au niveau interne.

    Utilise des long, là t'auras pas ce problème mais ça va restreindre la grandeur de ton nombre.


  16. #16
    Membre du Club
    Inscrit en
    Octobre 2009
    Messages
    72
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 72
    Points : 42
    Points
    42
    Par défaut
    merci moins1, mais bon je vois que je vais faire autrement, je voulais récupéré un ensemble de réel, calculer leurs moyenne, mais à ce que je vois je dois changer de stratégie, je crois que je vais juste récupéré les chiffres de manière isolé, et les faire passé vers notre bon vieux Excel .

  17. #17
    Membre éprouvé
    Avatar de Celelibi
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    1 087
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 087
    Points : 1 122
    Points
    1 122
    Par défaut
    Citation Envoyé par Umlist Voir le message
    lol, thx Bktero, mais je croyais que la machine etait bête et discipliné, tu lui demande de lire une chose, elle s'execute et te donne EXACTEMENT ce dont tu lui a demandé.
    à ton avis, si je prend ces chiffres comme etant des strings puis convertir en float comme l'a dit Celilibi, crois tu qu'elle me donnera exactement les même valeurs?
    Tu as tout à fait raison, la machine te donnera toujours le même résultat. L'informatique est un monde exact et déterministe. L'erreur que les ordinateurs produisent dans les calculs sont systématiquement les mêmes et sont calculables. Et elles sont de plus inévitables, car la capacité de traitement et la capacité de stockage sont bornés.

    Imagine que tu as une feuille blanche sur laquelle tu ne puisse écrire que 20 chiffres au total. Pas un de plus.
    Puis je te demande de m'écrire sur cette feuille le résultat de 10.0/3.0.
    Tu vas pouvoir écrire 3.3333333333333333333. C'est un résultat approché. Et quand moi je lis ce nombre, je sais qu'il n'est précis qu'à 10^-19 près.

    Sûr les flottants, c'est pareil. Sauf que les calculs se font en binaire et que c'est le nombre de bit par nombre qui est limité. Et tous les calculs se font avec une précision bornée.

    De plus lire une chaîne de caractère et la convertir en float est un calcul, puisqu'il faut convertir la base 10 en base 2.

    Il faut bien garder en tête que les float ne sont pas des réels. Les réels ça n'existe qu'en maths. Les float ne sont pas non plus des rationnels. C'est quelque chose de bâtard entre les entiers et les rationnels.

    Tout ce que tu peux faire pour améliorer la précision de tes calculs, c'est utiliser plus de bits (une feuille plus grande). Essaye déjà avec des double.



    Citation Envoyé par Umlist Voir le message
    merci moins1, mais bon je vois que je vais faire autrement, je voulais récupéré un ensemble de réel, calculer leurs moyenne, mais à ce que je vois je dois changer de stratégie, je crois que je vais juste récupéré les chiffres de manière isolé, et les faire passé vers notre bon vieux Excel .
    Tu crois qu'il va faire comment excel ?
    Les vaches ne peuvent PAS voler, quoi qu'elles aient pu vous raconter.

  18. #18
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 387
    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 387
    Points : 23 703
    Points
    23 703
    Par défaut
    Citation Envoyé par Umlist Voir le message
    mais ce que je trouve illogique droggo, c'est que quand tu ouvre le fichier tu trouve quatre chiffre apres la virgule, et puis quand tu affiche avec printf tu trouve plus que quatre chiffre.... c'est quoi ces bêtises!!!!!
    Comme on te l'a dit au-dessus, les nombres finis en décimal ne le sont pas forcément en binaire. Voici un exemple avec des valeurs triviales :

    1,5 en décimal = 1,1 en binaire
    1,2 en décimal = 1,001100110011001100110011001100110011 … en binaire, sans s'arrêter.

    Si tu peux travailler avec, c'est parce que les routines d'affichage sont faites pour automatiquement arrondir le nombre à la valeur décimale la plus proche au delà d'une certaine limite après la virgule.

    Voici une discussion où l'on met en évidence ce phénomène :

    http://www.developpez.net/forums/d10...e/#post6052599

    Citation Envoyé par Umlist Voir le message
    merci moins1, mais bon je vois que je vais faire autrement, je voulais récupéré un ensemble de réel, calculer leurs moyenne, mais à ce que je vois je dois changer de stratégie, je crois que je vais juste récupéré les chiffres de manière isolé, et les faire passé vers notre bon vieux Excel .
    Celibi a raison : Excel est une grosse calculatrice qui souffre du même défaut que tout le reste. Si tu veux avoir des résultats exacts, il faut lui demander d'utiliser une représentation décimale en mémoire des nombres que tu saisis, à la manière des BigDecimals du Java. Je ne sais pas s'il le peut le faire et dans tous les cas, ça rend les traitements extrêmement lourds et tu perds énormément en rapidité de calcul.

  19. #19
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 945
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 945
    Points : 5 659
    Points
    5 659
    Par défaut
    Mai,
    Citation Envoyé par Obsidian Voir le message
    Celibi a raison : Excel est une grosse calculatrice qui souffre du même défaut que tout le reste. Si tu veux avoir des résultats exacts, il faut lui demander d'utiliser une représentation décimale en mémoire des nombres que tu saisis, à la manière des BigDecimals du Java. Je ne sais pas s'il le peut le faire et dans tous les cas, ça rend les traitements extrêmement lourds et tu perds énormément en rapidité de calcul.
    Ça ne fait que reculer la limite.

    Les réels ne sont définitivement pas exactement représentables pour un ordinateur.

    Comme je l'ai déjà écrit plus haut : (quels que soient 2 nombres réels différents, il en existe une infinité entre eux ...), et dès qu'on parle d'infini, le monde réel est hors course.
    Si les cons volaient, il ferait nuit à midi.

  20. #20
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 387
    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 387
    Points : 23 703
    Points
    23 703
    Par défaut
    Citation Envoyé par droggo Voir le message
    Ça ne fait que reculer la limite.
    Les réels ne sont définitivement pas exactement représentables pour un ordinateur.

    Comme je l'ai déjà écrit plus haut : (quels que soient 2 nombres réels différents, il en existe une infinité entre eux ...), et dès qu'on parle d'infini, le monde réel est hors course.
    Je suis d'accord, mais la question initiale du primo-postant était de faire en sorte que scanf ne lise que n chiffres après la virgule. Son problème est que même de cette façon, le nombre ainsi formé peut ne pas être représentable en binaire.

    Mais à partir du moment où on travaille directement avec des chiffres décimaux ET que l'on fixe une limite aux nombres de décimales, alors on peut représenter tout ce qui entre dans ce cahier des charges.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Limiter le nombre de chiffres après la virgule
    Par a-sana dans le forum Langage
    Réponses: 5
    Dernier message: 31/01/2013, 11h15
  2. [C#] Limiter le nombre de chiffre apres la virgule ?
    Par MaxiMax dans le forum ASP.NET
    Réponses: 3
    Dernier message: 01/08/2011, 14h20
  3. limiter le nombre de chiffre après la virgule
    Par zakaroh dans le forum C#
    Réponses: 9
    Dernier message: 06/10/2008, 13h09
  4. Réponses: 3
    Dernier message: 03/05/2008, 16h44
  5. Comment limiter le nombre de chiffre après la virgule ?
    Par Hoopsy dans le forum C++Builder
    Réponses: 15
    Dernier message: 06/07/2007, 16h12

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