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 :

double ,float qui sert à quoi ?


Sujet :

C

  1. #1
    Membre régulier
    Inscrit en
    Décembre 2006
    Messages
    165
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 165
    Points : 76
    Points
    76
    Par défaut double ,float qui sert à quoi ?
    bonjour tout le monde

    toujours cet épineux problème double et float servent normalement (je ne sais plus ce qui est normale en C) à représenter des chiffre décimaux c.à.d avec virgule .

    En représentant sur ce code les décimaux par un double j'obtiens un zéro alors que sur un autre code
    en mettant un float j'obtiens un nombre avec virgule certes mais seulement approximatif
    voici les deux codes :
    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
    #include <stdio.h>
     
    main()
     
    {
     
    float prix , tva , totalTva ;  /*il faut chercher la différence car en mettant float j'ai un bon résultat en mettant double j'obtient tout simplement une connerie */
     
    prix       = 0.0 ;    //initialisation des variables
    tva        = 0.2 ;
     
    printf("entrez le prix à calculer : \n");
    scanf("%f",&prix);
     
    totalTva  = prix * tva ; 
     
    printf("le ttc est de : %1.2f\n",totalTva);
     
    //return 0;
     
    }
    voici le second :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #include <stdio.h>
    #include <stdlib.h>
     
    main()
     {
    double soldeBanque = 6500000000.0 ;
    //printf("vous avez %f dirhams en banque\n", soldeBanque);
     
    printf("vous aviez %.2f dirhams en banque\n", soldeBanque);
    printf("vous avez maintenant %.2f dirhams en banque\n", 0.0);
     
    return 0; 
     }
    j'avoue que c'est mauvais si on ne sait pas à l'avance ce que produit tel ou tel format.
    pouvez s.v.p m'explique où et quand et pourquoi dois je utiliser tel ou tel terme
    merci d'avance
    j'y crois encore

  2. #2
    Membre expérimenté
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Points : 1 727
    Points
    1 727
    Par défaut
    Salut,

    Pourrais tu expliquer mieux ton probleme car là c'est pas clair?
    Sinon, les constantes flottantes sont des doubles (quand on ecrit "0.2", c'est un double) et il est preferable d'utiliser des doubles à la place de floats quand on veut manipuler des flottants

  3. #3
    Membre régulier
    Inscrit en
    Décembre 2006
    Messages
    165
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 165
    Points : 76
    Points
    76
    Par défaut
    bien sûr ,sur le premier code en remplaçant float par double le programme donnne un zéro,exmple si le 45 la tva normalement est de 9.

    alors que double et float servent tout deux pour des réels voilà ce que je ne comprend pas ???

  4. #4
    Membre expérimenté
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Points : 1 727
    Points
    1 727
    Par défaut
    Ok, je pense que c'est le specificateur de format de ton scanf qui est pas bon. En effet il essayerait de stoquer un float dans un double et ça donnerait n'importe quoi vu que la representation n'est pas la même.
    Le specificateur de format pour un double est %lf.
    http://man.developpez.com/man3/scanf.3.php

  5. #5
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par abdelilah Voir le message
    toujours cet épineux problème double et float servent normalement (je ne sais plus ce qui est normale en C)
    double. float ne devrait servir que quand il y a de bonnes raisons de ne pas utiliser double -- la plus courante étant pour le stockage.

    à représenter des chiffre décimaux c.à.d avec virgule .
    Si tous les flottants sont des décimaux, représenter les décimaux n'est pas leur objectif et donc pas mal de décimaux simples comme 0.1 ne sont pas représentables.

    Les flottants sont des entiers multipliés par une puissance (éventuellement négative) de 2. Quand on veut stocker dans un flottant un nombre qui n'a pas de représentation, un arrondi permet de choisir un nombre représentable proche. Par exemple 0.1 peut être représenté par 1677722/2^24 (2^24=16777216). Suivant le format d'affichage, cette différence peut être visible où pas.

    J'oubliais: on n'utilise normalement pas les flottants (double ou float) pour socker des sommes. Les règles comptables sont assez strictes et tenir compte des particularités des flottants pour les implémenter est possible mais souvent pas la meilleure solution. Ce qu'on fait est utiliser des sommes entières (long suffit rarement d'ailleurs) d'une unité sous-multiple de l'unité principale (utiliser les centimes par exemple) en manipulant l'affichage pour qu'il montre ce qu'on veut.
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  6. #6
    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 abdelilah Voir le message
    toujours cet épineux problème double et float servent normalement (je ne sais plus ce qui est normale en C) à représenter des chiffre décimaux c.à.d avec virgule .
    Tu as déjà eu beaucoup de réponses ici :

    http://www.developpez.net/forums/sho...d.php?t=436574

    Alors relit tout ça, et si il y a un point douteux, pose une question précise.
    Pas de Wi-Fi à la maison : CPL

  7. #7
    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 abdelilah Voir le message
    bien sûr ,sur le premier code en remplaçant float par double le programme donnne un zéro,exmple si le 45 la tva normalement est de 9.
    Si tu fais une saisie avec un double il faut utiliser "%lf" et non "%f". Tu n'ouvres jamais ton livre de C ?

    alors que double et float servent tout deux pour des réels voilà ce que je ne comprend pas ???
    On te l'a déjà expliqué. Les double sont le type de base qui servent à tout. Les float sont un type réduit (donc moins précis) qui servent quand on ne peut pas faire autrement (problème de stockage, de taille mémoire etc.)

    Tu ne comprends pas ce qu'on te dit ? A la longue, c'est fatiguant de répéter tout le temps la même chose...
    Pas de Wi-Fi à la maison : CPL

  8. #8
    Membre régulier
    Inscrit en
    Décembre 2006
    Messages
    165
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 165
    Points : 76
    Points
    76
    Par défaut
    bonjour

    vous avez raison Emmanuel Delahaye à force de répéter cela devient agaçant,j'ai relus les postes ainsi que votre tutoriel,alors le problème précis qui me vient à l'esprit est le suivant.

    supposez que vous souhaitez créer une application de calcul où l'utilisateur aura à saisir des valeurs à sa guise dans une variante prix qui peut aller du simple zéro jusqu'au valeur qui provoqueront le débordement d'un float comment pourrais t on faire pour garder des résultats non pas approximatifs .

    Comment éviter cette contrainte car en utilisant float pour la variable prix ça marche pour les petites quantités,mais en pour les grandes valeurs c'est une autre histoire, en utilisant double nous aurons des valeurs absurdes en calculant
    de petites valeur s.

    quelqu'un pourrait il m'éclaircir car j'avais l'habitude d'utiliser pascal qui ne connait pas ce genre de contraintes.

    merci d'avance.

  9. #9
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par abdelilah Voir le message
    Comment éviter cette contrainte car en utilisant float pour la variable prix
    Quelle partie de "on n'utilise pas les flottants, que ce soit les double ou les float, pour de l'argent" tu ne comprends pas?

    ça marche pour les petites quantités,mais en pour les grandes valeurs c'est une autre histoire, en utilisant double nous aurons des valeurs absurdes en calculant
    de petites valeur s.
    Mais non. Dans les deux cas tu vas obtenir des valeurs que tu considéreras absurdes. Ce ne sont pas les mêmes, c'est tout.

    quelqu'un pourrait il m'éclaircir car j'avais l'habitude d'utiliser pascal qui ne connait pas ce genre de contraintes.
    Les problèmes avec les flottants sont les mêmes partout.
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  10. #10
    Membre régulier
    Inscrit en
    Décembre 2006
    Messages
    165
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 165
    Points : 76
    Points
    76
    Par défaut
    bonjour

    merci pour vos réponses,voilà j'ai compris à partir de cette phrase :

    Jean-Marc.Bourguet à dit:
    Ce qu'on fait est utiliser des sommes entières (long suffit rarement d'ailleurs) d'une unité sous-multiple de l'unité principale (utiliser les centimes par exemple) en manipulant l'affichage pour qu'il montre ce qu'on veut.
    donc je sais dorénavant qu'il est suicidaire d'utiliser float ou double pour stocker des prix,long suffit largement quoique toute chose a ses limites,
    mais concrètement comment peut on utiliser cette méthode pouvez svp
    me montrer la méthode dans un code.

  11. #11
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    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 690
    Points : 30 986
    Points
    30 986
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par abdelilah Voir le message
    car j'avais l'habitude d'utiliser pascal qui ne connait pas ce genre de contraintes.
    Ce problème est inhérent à la majorité des conversion des nombres décimaux (humains) en binaire (ordinateur).
    Pour convertir une partie décimale en binaire tu la multiplies jusqu'à ce que la partie décimale tombe à 0
    Exemple: 0.875
    0.875 x 2 = 1,75 => tu gardes le "1" et il te reste 0.75
    0.75 x 2 = 1,5 => tu gardes le "1" et il te reste 0.5
    0.5 x 2 = 1.0 => tu gardes le "1" et tu as fini
    Résultat: 0.875 en base 2 donne 111 (en sachant qu'il y a une virgule au tout début)

    Le problème est qu'il existe un paquet de nombres où ça ne marche pas. par exemple avec 0.77
    0.77 x 2 =1,54
    0.54 x 2 = 1,08
    0,08 x 2 = 0,16
    0,16 x 2 = 0,32
    0,32 x 2 = 0,64
    0,64 x 2 = 1,28
    0,28 x 2 = 0,56
    ... (on n'arrive jamais à 0)

    => l'ordi est obligé d'arrondir son résultat. Et quand il retransforme en décimal, ben l'arrondi peut devenir une erreur...

    Citation Envoyé par abdelilah Voir le message
    bonjour

    merci pour vos réponses,voilà j'ai compris à partir de cette phrase :



    donc je sais dorénavant qu'il est suicidaire d'utiliser float ou double pour stocker des prix,long suffit largement quoique toute chose a ses limites,
    mais concrètement comment peut on utiliser cette méthode pouvez svp
    me montrer la méthode dans un code.
    Ca veut dire qu'au lieu de travailler avec, par exemple, des sommes ressemblant à "12,25 euro", tu travailleras avec des sommes ressemblant à "1225 cents" => Ici tu travailles avec des "int" donc tu n'as plus ce problème de nombre à virgule.
    Pour pouvoir faire ça, faut évidemment que ton projet s'y prête...
    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]

  12. #12
    Membre régulier
    Inscrit en
    Décembre 2006
    Messages
    165
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 165
    Points : 76
    Points
    76
    Par défaut
    bonsoir

    merci pour cette réponse je compris enfin le pourquoi du comment, en tout cas je garde cette page dans mes favoris sait on jamais .

    merci tout le monde.

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

Discussions similaires

  1. Qui sert à quoi ?
    Par abdelilah dans le forum Débuter
    Réponses: 6
    Dernier message: 01/11/2007, 12h01
  2. Suppression de cadre autour d'une image qui sert de lien
    Par vasilov dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 03/04/2005, 13h02
  3. Ça sert à quoi ?
    Par sokadavia dans le forum Scheme
    Réponses: 4
    Dernier message: 18/05/2004, 11h12

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