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 :

Partie décimale d'un float


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Janvier 2011
    Messages : 247
    Par défaut Partie décimale d'un float
    Bonjour à tous!
    Voila, pour un de mes codes j'ai besoin de récupérer la partie décimale d'un float et sans utiliser floor() (pour faire une soustraction ensuite) parce que je n'ai pas droit à la librairie math.h.
    J'utilise donc un cast. J'ai un truc du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    float f=2.76578;
     
    f-=(int)f;
    printf("%d",f);
    Seulement, pour certaines valeures, les résultats sont différents: par exemple 2.876, au lieu que j'obtienne 0,876, j'ai 0.875999...
    Je voudrais savoir pourquoi j'ai ce genre de résultat et savoir s'il y a un autre moyen de récupérer la prtie décimale.

  2. #2
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Juillet 2010
    Messages
    107
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 107
    Par défaut
    Slt,

    Pour la raison de ton problème de précision :
    http://en.wikipedia.org/wiki/Floatin...uracy_problems
    http://fr.wikipedia.org/wiki/Virgule_flottante

    Personnellement j'évite le plus souvent l'utilisation des nombres à virgule flottante, surtout sur les systèmes embarqués.
    Je préfère les entiers et adapter l'unité de mes variables.

    Sinon, si tu souhaites seulement faire un printf, il faut lui préciser le format de sortie.
    Un petit "man printf" dans google te donne :
    http://www.linux-kheops.com/doc/man/...sprintf.3.html

    Dans ton cas c'est :
    printf( "%'.2f", ta_variable_float );

    @+

  3. #3
    Membre très actif
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Janvier 2011
    Messages : 247
    Par défaut
    Je ne veux pas juste les afficher mais connaitre la partie décimale. Autrement dit, je voudrais avoir par exemple 0.65 pour 2.65 et non 2.649999.

  4. #4
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 484
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 484
    Par défaut
    Citation Envoyé par dré kam Voir le message
    Seulement, pour certaines valeures, les résultats sont différents: par exemple 2.876, au lieu que j'obtienne 0,876, j'ai 0.875999...
    Je voudrais savoir pourquoi j'ai ce genre de résultat et savoir s'il y a un autre moyen de récupérer la prtie décimale.
    C'est dû au fait que 2,876 n'est pas un nombre fini en binaire.

    What every computer scientist should know about floating point arithmetic ;
    http://www.developpez.net/forums/d10...obleme-malloc/

    Dans le cas de 2,876, le nombre est arrondi par défaut ou par excès en atteignant la fin de la mantisse, et est arrondi par défaut à six chiffres après la virgule lorsque tu l'affiches en décimal.

    Ici, quand tu soustrais la partie entière, tu gagnes exactement deux bits, et tu te retrouves avec deux bits à zéro insérés au bout de la mantisse. Dans le calcul, ça suffit à faire arrondir le nombre par défaut plutôt que par excès.

    Le moyen le plus simple si tu ne veux pas utiliser de fonctions dédiés, dans ce cas, consiste à faire passer les décimales dans la partie entière, dans à multiplier par 1000 si tu veux garder trois décimales. Tu convertis le tout en entier, tu soustrais l'ex-partie entière elle-aussi multipliée par 1000, tu reconvertis en flottant et tu redivises par 1000.

  5. #5
    Membre très actif
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Janvier 2011
    Messages : 247
    Par défaut
    Citation Envoyé par Obsidian Voir le message
    C'est dû au fait que 2,876 n'est pas un nombre fini en binaire.

    Le moyen le plus simple si tu ne veux pas utiliser de fonctions dédiés, dans ce cas, consiste à faire passer les décimales dans la partie entière, dans à multiplier par 1000 si tu veux garder trois décimales. Tu convertis le tout en entier, tu soustrais l'ex-partie entière elle-aussi multipliée par 1000, tu reconvertis en flottant et tu redivises par 1000.
    Oui je comprends, ca marche. Mais je veux que ca marche avec n'importe quel float. Donc à combien de chiffres après la virgule s'arrète un float généralement? c'est-a-dire un %f avec printf.

  6. #6
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 484
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 484
    Par défaut
    Citation Envoyé par dré kam Voir le message
    Donc à combien de chiffres après la virgule s'arrète un float généralement? c'est-a-dire un %f avec printf.
    C'est écrit dans mon précédent commentaire.

  7. #7
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Juillet 2010
    Messages
    107
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 107
    Par défaut
    La solution du coefficient multiplicateur fonctionne avec n'importe quel float. Tu dois juste définir dès le départ la précision que tu souhaites garder.

    Sinon, une autre méthode consiste à garder ta variable décomposée en numérateur et dénominateur.
    Du coup, les opérations mathématiques sur des entiers peuvent être réalisées sans aucune approximation et c'est seulement au moment de l'affichage que tu divises le numérateur par le dénominateur.

    Une multiplication par un nombre devient la multiplication du numérateur par ce nombre.
    Une division par un nombre devient la multiplication du dénominateur par ce nombre.
    Une addition par un nombre devient l'addition au numérateur du nombre multiplié par le dénominateur.
    Une soustraction par un nombre devient la soustraction au numérateur du nombre multiplié par le dénominateur.
    Après chaque opération est fortement conseillé de réaliser une simplification des fractions.

    Cette méthode permet la comparaison correct entre deux variables.

    Cette complexité est le prix de la précision. Mais as-tu vraiment besoin d'une telle précision ?

  8. #8
    Membre très actif
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Janvier 2011
    Messages : 247
    Par défaut
    En fait je veux juste pouvoir afficher un float, passé en paramètre, à l'écran un peu comme printf.
    Ce matin j'ai encore essayé d'autres méthodes mais is se trouve que dés que je fais la moindre multiplication, la valeur est perdue (2.876*10=28.7599...).
    Est ce qu'il est possible de travailler directement avec la mentisse et l'exposant?

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

Discussions similaires

  1. retourner la partie décimale d'un float
    Par sheridan08 dans le forum Général Python
    Réponses: 16
    Dernier message: 09/01/2022, 22h00
  2. Extraire la partie décimale d'un float
    Par kryptong dans le forum Débuter
    Réponses: 15
    Dernier message: 19/01/2013, 22h01
  3. Extraire la partie décimal d'un float en c
    Par souhe_nits dans le forum Débuter
    Réponses: 5
    Dernier message: 22/03/2011, 17h15
  4. Parties entière et décimale d'un float
    Par amateurc dans le forum Ada
    Réponses: 15
    Dernier message: 31/07/2008, 20h42
  5. Réponses: 15
    Dernier message: 30/01/2008, 18h23

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