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 :

Conversion float en int


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 36
    Par défaut Conversion float en int
    Bonjour à tous et à toutes !

    J'ai développé un programme qui utilise que des entiers ou des flottants (pas de double), lors de la conversion d'un flottant vers un entier, j'ai un résultat inattendu et je souhaiterai si possible avoir une explication...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #include <iostream>
     
    using namespace std;
     
    int main(int argc, char** argv) {
        float t = 0.45;
        cout << "t = " << static_cast<int>(t*100) << endl;
        return 0;
    }
    Quand ce code est exécuté il me retourne "44", savez-vous pourquoi ?
    Merci d'avance,
    Nicolas.

  2. #2
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Bonjour,
    C'est parce que les floats ne sont pas exacts (en base 10). Ils sont précis (mais limités) en base 2.

    Du coup, 0.45 * 100 est probablement 44.999... ce qui donne le 44 que tu obtiens.

  3. #3
    Membre averti
    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 36
    Par défaut
    Bonsoir et merci pour cette réponse, j'utilise un double, ça fonctionne bien.

  4. #4
    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
    Par défaut
    Citation Envoyé par nikobordx Voir le message
    Bonsoir et merci pour cette réponse, j'utilise un double, ça fonctionne bien.
    Il n'y a pas de raisons...
    Peut-être qu'en double, 0.45 est représenté par 0.4500000....0001, et que ça se passe bien, mais que 0.46 sera représenté par 0.4599999999... et que ça se passera mal.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  5. #5
    Membre averti
    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 36
    Par défaut
    A vrai dire je n'ai que du 0.45, 0.35 et au pire 0.25, donc pas de souci en vue...

    Mais, y a t'il une solution pour que ce soit vraiment précis ?

  6. #6
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    J'ai développé un programme qui utilise que des entiers ou des flottants (pas de double)
    Deuxième règle d'emploi des flottants: on utilise le type le plus précis qu'on peut sauf si on sait ce que l'on fait.

    Citation Envoyé par nikobordx Voir le message
    A vrai dire je n'ai que du 0.45, 0.35 et au pire 0.25, donc pas de souci en vue...
    Je n'en suis pas aussi sûr que toi. (La valeur avec le moins de soucis, c'est 0.25 qui est représentable exactement dans les formats courants).

    Mais, y a t'il une solution pour que ce soit vraiment précis ?
    Défini précis. Il y a une infinité non dénombrable de réel, et en prime ceux-ci sont denses (entre deux réels, il y en a toujours une infinité non dénombrables d'autres). Être vraiment précis, il faut utiliser du calcul symbolique, avec son lot de problèmes et de limitations propres.

    Les flottants décimaux ne donnent guère qu'une illusion de précision (ils permettent de représenter une partie des réels dont l'expression décimale est simple), mais son en fait moins précis que les flottants binaires et ont tous les autres problèmes des flottants binaires, et quelques uns en plus. P.e. (a+b)/2 peut être strictement plus petit que min(a, b)).

    Bon, dans le cas présent, ton problème n'est pas un vrai problème de précision, c'est plutôt parce que tu tronques quand arrondir conviendrait mieux. Autrement dit, utilise lround() à la place de static_cast<int>

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

Discussions similaires

  1. Conversion float vers int
    Par jeremy75 dans le forum C++
    Réponses: 2
    Dernier message: 20/05/2014, 16h54
  2. Conversion float en int?
    Par romain1 dans le forum Débuter avec Java
    Réponses: 1
    Dernier message: 06/09/2008, 18h44
  3. Conversion du type int à float
    Par @yoyo dans le forum Débuter
    Réponses: 9
    Dernier message: 16/01/2008, 12h22
  4. probleme de conversion float en int
    Par murreya dans le forum C++
    Réponses: 2
    Dernier message: 17/12/2005, 15h27
  5. Conversion float vers int
    Par vargasvan dans le forum C
    Réponses: 2
    Dernier message: 05/10/2005, 17h29

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