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 et float


Sujet :

C

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2018
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2018
    Messages : 3
    Points : 1
    Points
    1
    Par défaut Double et float
    Bonjour,
    je débute et je bute sur le mini-code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    int main(void)
    {
        double x;
        scanf("%f",&x);
        printf("%f",x);
        return 0;
    }
    Si je fais tourner, et que je tape 0.3425, la console me répond 0.000000 ; je ne comprends pas, en définissant x comme étant de type double, j'ai bien un nombre réel affecté à x ?
    D'où "l'erreur" provient-elle ? Dois je modifier le %f ?
    Si je change double en float, cela fonctionne (affichage 0.342500).
    Merci pour votre éclairage -

  2. #2
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2018
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2018
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Ok bon je viens de trouver une explication qui concerne la "taille" - avec %lf cela fonctionne - c'est quand même curieux ; en fait on peut écrire de plus grands nombres type double comparé à float, ok, mais "si le nombre est déclaré en double" avec une taille convenable pour float, cela ne fonctionne quand même pas ; d'où cela provient-il ?

  3. #3
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 630
    Points : 10 556
    Points
    10 556
    Par défaut
    C'est simple pourtant
    Un nombre réel contient : un exposant, une mantisse significande et le signe.

    Trouvé sur Internet, donc peut-être erroné
    • float : 23 bits of significand, 8 bits of exponent, and 1 sign bit.
    • double : 52 bits of significand, 11 bits of exponent, and 1 sign bit.


    Donc lorsque tu castes un double vers un float, cela fait n'importe quoi

    Précision : le l en plus dans le format, permet de prendre un format de type long (avec un compilateur 32bits, ce sont en général les nombre 64bits)

  4. #4
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2018
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2018
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Merci pour le retour -
    ok si je comprends bien l'ordinateur alloue une certaine place lorsqu'on définit un double (64bits = 64 cases), et ce n'est pas parce que certaines cases sont "vides = avec des 0" qu'elles ne sont pas prises en compte ; du coup si on "convertit" en float (32 bits) il y a perte en ligne, par contre en long float ça marche (64 bits)

  5. #5
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    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 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Bonjour

    Pour le printf() ça passe encore, le plus souvent il arrive à s'adapter. C'est surtout le scanf() qui a besoin d'une précision de chronomètre car c'est lui qui va remplir ces "cases".
    Bien entendu, cela n'empêche pas non plus de donner les bonnes précisions aussi au printf()...
    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 éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Le problème de ce côté-là, c'est que printf() et scanf() ont des syntaxes de format différentes, en partie parce qu'il est impossible de passer un float à printf(): Les règles font qu'un float passé par valeur à une fonction variadique est automatiquement promu en double, donc printf() n'a pas besoin d'avoir deux codes différents pour float et double.

    scanf() par contre, a besoin de deux codes différents, car son passage de paramètres se fait par pointeur; la fonction doit donc savoir si elle a reçu un pointeur de float ou un pointeur de double.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #7
    Inactif  
    Homme Profil pro
    Architecte matériel
    Inscrit en
    Décembre 2017
    Messages
    155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Architecte matériel

    Informations forums :
    Inscription : Décembre 2017
    Messages : 155
    Points : 0
    Points
    0
    Par défaut
    Citation Envoyé par foetus Voir le message
    C'est simple pourtant
    Un nombre réel contient
    NON

    Un nombre à virgule flottante.

    Un flottant pour faire plus court.

    Citation Envoyé par foetus Voir le message
    C'est simple pourtant
    un exposant, une mantisse significande et le signe.
    On ne dit plus mantisse? Depuis quand?

    Citation Envoyé par foetus Voir le message
    Donc lorsque tu castes
    Il n'y a aucun cast (conversion explicite) ici.

  8. #8
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 630
    Points : 10 556
    Points
    10 556
    Par défaut
    Citation Envoyé par liberal1 Voir le message
    NON Un nombre à virgule flottante. Un flottant pour faire plus court.
    Bof la seule différence que je vois, c'est qu'un nombre à virgule flottant ne peut pas représenter tous les réels.


    Citation Envoyé par liberal1 Voir le message
    On ne dit plus mantisse? Depuis quand?
    Je ne sais pas mais c'est une histoire de log/ ln : wiki mantisse


    Citation Envoyé par liberal1 Voir le message
    Il n'y a aucun cast (conversion explicite) ici.
    Et dans printf ? et dans scanf ? Sinon cela vient du compilateur

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. différence entre double et float
    Par Maria1505 dans le forum C++
    Réponses: 2
    Dernier message: 03/01/2007, 05h16
  3. du double au float
    Par yvesall dans le forum C
    Réponses: 7
    Dernier message: 10/11/2006, 16h13
  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