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 :

Problème de calcul et d'affichage de nombres réels


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Avatar de Luke spywoker
    Homme Profil pro
    Etudiant informatique autodidacte
    Inscrit en
    Juin 2010
    Messages
    1 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiant informatique autodidacte

    Informations forums :
    Inscription : Juin 2010
    Messages : 1 077
    Par défaut Problème de calcul et d'affichage de nombres réels
    Salut les programmeurs C,

    Je continue de découvrir le C mais je n'ai pas encore commencé l'apprentissage de la standard library en profondeur d'où cette question réellement a 2 centimes :

    À 2 cents plus exactement car j'ai fait un programme qui calcule ce dont vous avez besoin exactement pour payer une addition :
    On entre une somme en Euro et le programme calcule de combien de billets et pièces de chaque sorte vous avez besoin pour avoir l'appoint dont je vous épargne le code source.
    Le problème est que je demande l'entrée avec:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    scanf("%f",&euro_entry) ;
    Le programme fait des modulo grâce à deux fonctions:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    int get_euro_mod(float s, int i) {
      return s/i ;
    }
     
    int get_cents_mod(float s, float i) {
     return s/i ;
    }
    successifs décroissant sur la somme entrée.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    euro_500=get_euro_mod(euro_entry, 500) ;
    euro_entry=euro_entry- (get_euro_mod(euro_entry, 500)*500) ;
    // ... 
    cents_01=get_cents_mod(euro_entry, 0.01) ;
    euro_entry= euro_entry- (get_cents_mod(euro_entry, 0.01)*0.01) ;
    J'ai bien essayé de formater l'entrée afin d'avoir un float a deux chiffres, sans succès, après, le point pour que l'appoint soit bon: le résultat est faussé à cause de la longueur de la représentation de la somme entrée.
    J'ai clairement identifié le problème venant de scanf() qui ne permet pas de constante tel : "%.2f" ou du moins qui génère des warnings et des erreurs de traitement dans ce cas là.

    Merci pour vos réponses.

  2. #2
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    Salut,

    C'est bien de continuer le C

    Tu devrais regarder cette discussion : http://www.developpez.net/forums/d13...es-virgule-lu/

    Une solution peut-être de lire avec fgets(), de convertir en un nombre de centimes et de faire les calculs avec des entiers et un facteur de 100.

  3. #3
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Salut
    Tu n'as pas bien explique ton soucis mais je pense que je le devine. Je crois que tu es confronte au probleme inherent a tous les ordis et tous les langages a propos du codage des decimaux.
    En effet, pour un ordi, un decimal est un nombre code a base de puissances negatives de 2. Donc 0.25 en base 10 etant 2^(-2) sera code 0.01 en base 2.

    Mais ce systeme ne marche pas pour tous les nombres et ainsi 0.6 sera code 0.1001001001001. Et dans l'autre sens si on decode ce chiffre, cela ne donne pas exactement 0.6 (cela donne 0.5999999 ou bien 0.6000001).

    D'ou la proposition de bktero de travailler exclusivement en centimes (entiers) quitte a convertir lors de la saisie et de l'affichage.

    Une autre solution serait d'utiliser une bibliotheque dediee a la gestion des decimaux. Ce genre de bibliotheque (qui existe en natif dans d'autres langages comme Python) code les decimaux chiffre par chiffre et effectue ensuite les calculs comme au primaire (chaque chiffre est pris independemment pour etre calcule avec chaque autre chiffre). Calculs (relativement) longs mais resultats garantis sans erreurs. Je sais qu'il en existe une ecrite en C qu'on peut telecharger et utiliser ensuite facilement dans ses codes C (on en parle parfois sur ce fofo)...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  4. #4
    Membre éprouvé
    Avatar de Luke spywoker
    Homme Profil pro
    Etudiant informatique autodidacte
    Inscrit en
    Juin 2010
    Messages
    1 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiant informatique autodidacte

    Informations forums :
    Inscription : Juin 2010
    Messages : 1 077
    Par défaut
    Merci pour vos réponses,
    Je connaissait le problème des nombres a virgule flottante et les problèmes de la représentation binaire de ceux-ci , d'ailleurs j'ai écrit un module en python qui permet de manipuler: additionner, soustraire et multiplier des string binaires et la division ne fait pas partie des fonctions du module justement a cause de ce problème, c'est pas vraiment un module réellement utile mais ca fait un peu de lecture car il ,est documenter et les méthodes de calcules sont calquer sur les règles du calcule binaire vous pouvez éventuellement jeter un œil a mon module:
    Module python de manipulation et de calcule de nombres binaires.

    Seulement je pensait qu'il existait une possibilité plus trivial avec le format de la constante de scanf, mais comme vous infirmez, il va falloir formater l'entrée comme dit dans la FAQ.

    Merci pour vos réponses.

  5. #5
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Luke spywoker Voir le message
    vous pouvez éventuellement jeter un œil a mon module:
    Module python de manipulation et de calcule de nombres binaires.
    Juste pour le plaisir alors parce que Python possede deja le module "decimal" qui gere de facon complete et exacte les calculs sur nombres decimaux...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  6. #6
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 967
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 967
    Par défaut
    Hai,
    Citation Envoyé par Sve@r Voir le message
    Juste pour le plaisir alors parce que Python possede deja le module "decimal" qui gere de facon complete et exacte les calculs sur nombres decimaux...
    De manière générale, ou spécifique pour la monnaie ?

    Car si c'est "général", alors c'est impossible : on tombe très souvent sur des nombres qui ont une infinité de décimales, il faut donc bien les limiter quelque part.

  7. #7
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Bktero Voir le message
    Tu devrais regarder cette discussion : http://www.developpez.net/forums/d13...es-virgule-lu/

    Une solution peut être de lire avec fgets(), de convertir en un nombre de centimes et de faire les calculs avec des entiers et un facteur de 100.



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char *euro ;
      fgets(euro,255,stdin) ;
    L'erreur de segmentation te dira sûrement merci un jour de ne pas allouer 255 octets pour y faire pointer euro !

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

Discussions similaires

  1. [Débutant] problème dans uimenu et d'affichage en temps réels
    Par Maria22 dans le forum Interfaces Graphiques
    Réponses: 2
    Dernier message: 19/08/2013, 13h48
  2. Formatage de l'affichage des nombres réels
    Par passkok dans le forum Langage
    Réponses: 8
    Dernier message: 26/11/2009, 19h29
  3. affichage des nombres réel
    Par tarek30 dans le forum JBuilder
    Réponses: 1
    Dernier message: 18/04/2009, 14h21
  4. [8.5]Problème pour calculer le nombre des personnes d'une liste
    Par Gotch59 dans le forum SAP Crystal Reports
    Réponses: 9
    Dernier message: 21/06/2007, 09h47
  5. Affichage des nombres réels!
    Par smail21 dans le forum Bases de données
    Réponses: 4
    Dernier message: 17/11/2005, 17h49

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