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 :

du double au float


Sujet :

C

  1. #1
    Membre éclairé
    Avatar de yvesall
    Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Novembre 2006
    Messages
    208
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2006
    Messages : 208
    Par défaut du double au float
    salut j ai un jolie truc bizard...
    j ai un code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    void    my_putfloat(double nb)
    {
      int   tmp;
     
      tmp = nb;
      putnbr(tmp);
      nb = (nb - tmp) * 1000000;
      putchar('.');
      tmp = nb;
      putnbr(tmp);
    }
    double nb = 3.905

    donc je devrais suite a cette methode retrouver 3.905, mais j obtiens 3.904999
    il me desarrondie (si je puis me permettre l expression) mon resultat

    j ai verifier et c est en faite tmp qui se vois attribuer 904999... donc j ai fais un autre teste

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    void    my_putfloat(double nbr)
    {
      int   tmp;
      float nb;
     
      nb = 3.095;
      tmp = nb;
      putnbr(tmp);
      nb = (nb - tmp) * 1000000;
      putchar('.');
      tmp = nb;
      putnbr(tmp);
    }
    et ca ca marche... quel est le probleme avec double ?

    y a t il un probleme lors de l attribution de la valeur d un float (ou d un double) a un int

  2. #2
    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 yvesall
    et ca ca marche... quel est le probleme avec double ?

    y a t il un probleme lors de l attribution de la valeur d un float (ou d un double) a un int
    Je soupçonne un problème dans put_nbr()

    Il faut savoir que la représentation de nombres réels en virgule flottante (c'est à dire signe, mantisse, exposant) n'autorise pas toutes les valeurs possibles. Certaines (peu) tombent juste, les autres (beaucoup !) sont des approximations. L'erreur est plus faible en double qu'en float.

    Je recommande donc d'utiliser exclusivement double. Le type float n'est utile pour le stockage de masse si on manque de place...)

  3. #3
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    3.905 n'est representable extactement ni dans un float ni dans un double. Je suppose que le double le plus proche est legerement inferieur a 3.905 et comme la conversion d'un double a un int se fait en tronquant vers 0, tu te retrouves avec 904999. Le float le plus proche doit etre legerement superieur a 3.905, donc tu vois bien 905000.

  4. #4
    Membre éclairé
    Avatar de yvesall
    Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Novembre 2006
    Messages
    208
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2006
    Messages : 208
    Par défaut
    alors vous feriez comment pour afficher un float sans passer par printf (juste putchar, toute mes fonction sont basee dessus), parce que je nage la...

  5. #5
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    sprintf puis ton putchar?

    Chercher sur le web du bon code pour afficher des flottants. C'est pas si simple que cela.

    On peut eventuellement un peu adapter ton code, genre:
    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
    void my_putfloat(double nb)
    {
      int   tmp;
     
      if (nb < 0) {
        putchar('-');
        nb = -nb;
      } 
      tmp = nb;
      putnbr(tmp);
      nb = (nb - tmp) * 1000000 + 0.5;
      putchar('.');
      tmp = nb;
      putnbr(tmp);
    }

  6. #6
    Membre éclairé
    Avatar de yvesall
    Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Novembre 2006
    Messages
    208
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2006
    Messages : 208
    Par défaut
    franchement merci ca roule bien, mais tu pourrais m expliquer comment ce fait il que un "+ 0.5" fasse ca... je suis un nb et je reste curieux de savoir

  7. #7
    Membre éclairé
    Avatar de yvesall
    Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Novembre 2006
    Messages
    208
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2006
    Messages : 208
    Par défaut
    ouai en faite non, ca marche pour plus de cas, mais pas pour tous...
    par exemple 32.6 foire.. je comprend pas pourquoi certain foire et pas d autre
    exemple 25.6 lui marche... pourquoi donc es ce si aleatoire ?

  8. #8
    Membre éclairé
    Avatar de yvesall
    Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Novembre 2006
    Messages
    208
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2006
    Messages : 208
    Par défaut
    laisser tomber ce que je viens de dire je suis un peu boulet, j avais un float i qui traianais a la place d un double i

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

Discussions similaires

  1. Convertion String en double ou float
    Par superjaja dans le forum C#
    Réponses: 6
    Dernier message: 31/12/2007, 13h00
  2. Passage double vers float
    Par Rastapopoulos dans le forum C++
    Réponses: 11
    Dernier message: 03/10/2007, 17h11
  3. différence entre double et float
    Par Maria1505 dans le forum C++
    Réponses: 2
    Dernier message: 03/01/2007, 05h16
  4. prototype erf : double ou float ?
    Par nicolas.puiroux dans le forum C
    Réponses: 5
    Dernier message: 07/09/2006, 10h39

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