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 :

Question sur les floats


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Responsable du parc et des réseaux de télécommunication
    Inscrit en
    Mars 2017
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Responsable du parc et des réseaux de télécommunication
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2017
    Messages : 20
    Par défaut Question sur les floats
    Bonjour bonjour,
    J'ai un peu honte aujourd'hui de venir poster pour ça, j'ai souvenir que les float ne sont pas réellement de vrai Float, quand on cherche à lire leur contenu réel on obtient souvent des petits chiffres loin, très loin après la virgule...même si l'écart est plus que négligeable. Du coup y a t'il un lien avec le truc tout bête qui m'améne aujourd'hui :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    	cout << "pas strange" << endl;
    	float i;
    	for (i=0;i<=1;i=i+0.2)
    	{
    		cout << i << endl;
    	}
    Affiche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    pas strange
    0
    0.2
    0.4
    0.6
    0.8
    1
    Jusque la pas de problémes
    Mais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    	cout << "strange" << endl;
    	float i;
    	for (i=0;i<=1;i=i+0.1)
    	{
    		cout << i << endl;
    	}
    Donne
    strange
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    strange
    0
    0.1
    0.2
    0.3
    0.4
    0.5
    0.6
    0.7
    0.8
    0.9
    L'ennui c'est que ça fait planter l'application de mon code, si une âme charitable veut bien éclairer .. je lui en serai gré


    EDIT je code en c++ 11 et je compile avec gcc version 4.9.3 (GCC) sous windows 7

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Par défaut
    Ça fait planter quoi et comment ?
    Les float ça se compare en utilisant epsilon.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  3. #3
    Membre averti
    Homme Profil pro
    Responsable du parc et des réseaux de télécommunication
    Inscrit en
    Mars 2017
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Responsable du parc et des réseaux de télécommunication
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2017
    Messages : 20
    Par défaut
    Désolé je viens répondre tardivement à ce forum (du coup je déterre) mais un grand merci à Bousk pour ta solution parfaite.
    Citation Envoyé par Bousk Voir le message
    Les float ça se compare en utilisant epsilon.
    Oui je comprend bien que les floats à 'valeurs précises' n'existe pas du point de vue de l'ordinateur d’où les imprécisions dans l'exécution de mon code.
    J'ai conscience de ne pas toujours employer un vocabulaire pointue.
    Encore merci à tous

  4. #4
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2011
    Messages
    760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 760
    Par défaut
    Les flottants ont une imprécision de représentation, car il n'est pas possible de représenter une infinité de valeur dans 32/64bits. Concernant l'affichage des nombres flottants, les flux ne montrent pas tous les chiffres après la virgule:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #include <iostream>
     
    int main()
    {
      std::cout.precision(11);
      for (float i=0; i <= 1; i+=0.2)
      {
        std::cout << i << "\n";
      }
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    0
    0.20000000298
    0.40000000596
    0.60000002384
    0.80000001192
    1
    Concernant ton compilateur, tu devrais le mettre à jour, la version 4.9 est super veille.

  5. #5
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par neokal Voir le message
    j'ai souvenir que les float ne sont pas réellement de vrai Float, quand on cherche à lire leur contenu réel on obtient souvent des petits chiffres loin, très loin après la virgule...
    Ah ! Tu dois te méprendre. Les variables de type float (ou de type double, qui sont en fait des long float) sont de vrais flottants. Peut-être que tu crois que float est la traduction de réel ou décimal mais ce n'est pas vrai. Les nombres réels sont des real numbers. La notation en virgule flottante (floating point arithmetic en anglais) est une manière pour un ordinateur de représenter des nombres réels et elle souffre d'imprécision.

  6. #6
    Membre expérimenté
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Mai 2016
    Messages
    313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2016
    Messages : 313
    Par défaut
    Indexer une boucle avec un type flottant est quand même une pratique assez malsaine, ça ne se fait pas, et je pense que ça devrait être interdit, comme ça l'est dans d'autres langages, ou au minimum que le compilateur devrait produire une alerte.
    Le problème ici provient du fait que le nombre 0.2 (l'incrément de cette boucle) n'existe pas en type flottant binaire tel qu'implémenté en IEEE-754 et correspondant aux types 'float' et 'double' (dans l'immense majorité des cas).
    Le nombre 0.1 n'existe pas non plus, et le fait que tu ne vois pas d'erreur arrondi sur 10 itérations est tout à fait fortuit, peut tomber en défaut sur un plus grand nombre d'itérations, ou produire des comportements différents d'un compilateur à l'autre en fonction du mode d'arrondi par défaut.

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

Discussions similaires

  1. question sur les floats
    Par bilal_sayed1 dans le forum Débuter
    Réponses: 3
    Dernier message: 19/02/2010, 12h29
  2. petite question sur les doubles et les float !
    Par kamouminator dans le forum C
    Réponses: 3
    Dernier message: 10/11/2006, 19h58
  3. question sur les variables globales et les thread posix
    Par souris_sonic dans le forum POSIX
    Réponses: 5
    Dernier message: 13/06/2003, 13h59
  4. Question sur les handles et les couleurs...
    Par MrDuChnok dans le forum C++Builder
    Réponses: 7
    Dernier message: 29/10/2002, 08h45
  5. question sur les message box !
    Par krown dans le forum Langage
    Réponses: 7
    Dernier message: 02/08/2002, 16h11

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