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 :

Division d'un double - probléme récurrent


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2005
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 135
    Par défaut Division d'un double - probléme récurrent
    Bonjour,

    Je posséde ce bête problème depuis longtemps et je n'ai jamais réussia le résoudre en effet :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     
     double c = 2097949151/(pow(2,31);
     printf("c: %lf\n",c);
    cela devrait m'afficher : 0.97
    or il m'affiche constamment 0.00000
    je ne sais pas si un probléme de formatage de sortie a l'écran ou un probléme de l'opérateur division.

    Merci a vous

  2. #2
    Membre Expert
    Avatar de muad'dib
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2003
    Messages
    1 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Janvier 2003
    Messages : 1 013
    Par défaut
    Quel compilateur et environnement utilise-tu ?

    Moi avec GCC 4.1.2 ça marche impeccable !!!
    alex@megabomb:~$ ./test
    c: 0.976934

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2005
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 135
    Par défaut
    j'utilise Devcpp soit Mingw me semble t-il
    je viens d'essayer avec Gcc sous Cygwin j'ai la même chose.

  4. #4
    Membre émérite
    Avatar de Freed0
    Profil pro
    Étudiant
    Inscrit en
    Mars 2005
    Messages
    635
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2005
    Messages : 635
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #include <stdio.h>
    #include <math.h>
     
    int main(void)
    {
    	double c = 2097949151 / pow(2,31);
     
    	printf("c: %lf\n",c);
     
    	return 0;
    }
    Une paranthèse de trop dans le pow() et math.h

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2005
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 135
    Par défaut
    Bonjour en fait apparemment cela venait d'un conflit de type.

    Il faut bien que dans une division toutes les opérandes soient du même type.
    Merci

  6. #6
    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 bonjour69
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     double c = 2097949151/(pow(2,31);
     printf("c: %lf\n",c);
    cela devrait m'afficher : 0.97
    or il m'affiche constamment 0.00000
    je ne sais pas si un probléme de formatage de sortie a l'écran ou un probléme de l'opérateur division.
    Pourquoi "%lf" ? C'est "%f". D'autre part, ton code est horriblement incomplet. On ne sait pas ce que tu as oublié (à part une parenthèse).

    Avec du code complet, on obtient :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    c: 0.976934
     
    Press ENTER to continue.

  7. #7
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    [boule de cristal]
    - il n'a pas inclus math.h, donc le compilateur compile l'expression comme si pow retournait un int et effectue une division entière entre une constante et un nombre indéterminé qui par hazard retourne 0.
    - il est sous windows où les long double et les doubles ont le même format, donc le printf fonctionne
    [/boule de cristal]

  8. #8
    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 Jean-Marc.Bourguet
    [boule de cristal]
    - il est sous windows où les long double et les doubles ont le même format, donc le printf fonctionne
    [/boule de cristal]
    Arf, le piège ! Avec printf(), le format des long double est "%Lf" et non "%lf" !

    Le format des float et des doubles est "%f".

    En C99, "%lf" existe, mais il se comporte comme "%f".
    En C90, je ne sais pas. Comportement indéfini ?

  9. #9
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Arf, le piège ! Avec printf(), le format des long double est "%Lf" et non "%lf" !
    C'est vrai. Pour info, c'est par parralélisme avec ?scanf où %f est utilisé pour les floats, %lf pour les doubles et %Lf pour les long double.

    En C90, je ne sais pas. Comportement indéfini ?
    Je ne sais pas. Je ne lis que les pages de gauche du seul bouquin de Schildt dont la possession soit avouable, et il y a une erreur d'impression, la page pertinante est manquante.

Discussions similaires

  1. Comment récupérer le résultat d'une division au format double ?
    Par The Molo dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 21/12/2007, 15h48
  2. Problème récurrent de compilation sous Dev-C++
    Par Erynvellon dans le forum Dev-C++
    Réponses: 3
    Dernier message: 25/06/2007, 19h51
  3. Gosu, petit problème récurrent
    Par tit'eiKo dans le forum Ruby
    Réponses: 3
    Dernier message: 07/05/2007, 21h00
  4. [API WIN32] Double problème: DialogBox && Statusbar
    Par Ackboo dans le forum Windows
    Réponses: 9
    Dernier message: 20/08/2006, 13h15
  5. Problème récurrent de mise à jour
    Par r@phy dans le forum Access
    Réponses: 8
    Dernier message: 10/02/2006, 13h19

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