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 :

Mon compilateur compte faux


Sujet :

C++

  1. #1
    Membre du Club

    Profil pro
    Inscrit en
    Octobre 2011
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 38
    Points : 69
    Points
    69
    Par défaut Mon compilateur compte faux
    Bonjour,

    voila j'ai un programme tout bête pour un calcul dans une boucle et le résultat est très bizarre car le compte est faux !

    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
    22
     
    #include <stdio.h>
    #include<conio.h>
     
    float t,a ;
     
    int main()
     
    { //normalement  QUAND t=16   a=95 ...
              // MAIS              t=16   a=90 ?!
     
        for (t=1  ;  t<=16  ;  t++)
     
        { 
             a=  60+(35/15)*(t-1) ;
             printf ("t=%f     a=%f  \n",t,a);
        }
     
        getchar();
     
        return 0;
    }
    Si quelqu'un pouvait m'expliquer l'erreur...
    merci d'avance.

  2. #2
    Membre averti
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juillet 2009
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant Chercheur

    Informations forums :
    Inscription : Juillet 2009
    Messages : 122
    Points : 306
    Points
    306
    Par défaut
    Salut nyergk,

    ton problème n'en est pas un, c'est une conséquence de l'opérateur de division que tu utilises. Les nombres 35 et 15 sont des entiers, le compilateur considère donc que l'opération 35/15 est une division entière, i.e. sans le reste de la division qui peut être obtenu par 35 % 15 (35 modulo 15) et qui vaut 5. La division entière vaut quant à elle 2 car 35=2*15+5.

    Ainsi, quand t=16, cela donne a=60+(35/15)*(t-1)=60+2*15=90.

    Si tu veux obtenir la "vraie" valeur de la fraction (au sens décimal), il te faut exprimer les opérandes comme des float. Par exemple,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    a = 60 + (35.0/15.0)*(t-1)
    Bonne soirée

  3. #3
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Points : 15 617
    Points
    15 617
    Par défaut
    Citation Envoyé par Meseira Voir le message
    il te faut exprimer les opérandes comme des float. Par exemple,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    a = 60 + (35.0/15.0)*(t-1)
    (mode chipoteur : double et pas float dans ton code )

  4. #4
    Membre averti
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juillet 2009
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant Chercheur

    Informations forums :
    Inscription : Juillet 2009
    Messages : 122
    Points : 306
    Points
    306
    Par défaut
    Citation Envoyé par gbdivers Voir le message
    (mode chipoteur : double et pas float dans ton code )
    Chipoteur, peut-être, mais juste, c'est sûr Merci pour cette précision.

  5. #5
    Membre éclairé

    Homme Profil pro
    Non disponible
    Inscrit en
    Décembre 2012
    Messages
    478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Non disponible

    Informations forums :
    Inscription : Décembre 2012
    Messages : 478
    Points : 877
    Points
    877
    Billets dans le blog
    1
    Par défaut
    Bonjour !
    mode emmerdeur : Pourquoi double ?
    C'est le type par défaut des nombres à virgule ?

    [EDIT] Merci !

  6. #6
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    3.0 est un double
    3.0f est un float

  7. #7
    Membre du Club

    Profil pro
    Inscrit en
    Octobre 2011
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 38
    Points : 69
    Points
    69
    Par défaut
    ok, merci

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

Discussions similaires

  1. Réponses: 32
    Dernier message: 04/04/2011, 08h56
  2. Réponses: 5
    Dernier message: 06/11/2010, 19h46
  3. fonctions openGL non connues de mon compilateur
    Par nonozor dans le forum OpenGL
    Réponses: 3
    Dernier message: 23/10/2009, 01h46
  4. Mon compilateur bug, ou peut etre moi !
    Par jbarreau-mainson dans le forum Débuter
    Réponses: 6
    Dernier message: 09/04/2009, 11h24
  5. [Débutant]Mon compilateur est-il vieux ?
    Par Janitrix dans le forum C
    Réponses: 2
    Dernier message: 18/10/2006, 21h35

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