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 :

Connaitre le nombre après la virgule


Sujet :

C++

  1. #1
    Nouveau candidat au Club
    Homme Profil pro
    Apprenti C++
    Inscrit en
    Juillet 2019
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Congo-Kinshasa

    Informations professionnelles :
    Activité : Apprenti C++

    Informations forums :
    Inscription : Juillet 2019
    Messages : 2
    Par défaut Connaitre le nombre après la virgule
    Bonjour,je voudrais créer une classe(ou type) fixed_32_t(en C++)mais pour ça je besoin de connaitre le nombre de chiffre après la virgule du float.
    Quelqu'un peut m'aider svp?

  2. #2
    Rédacteur/Modérateur


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

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 145
    Billets dans le blog
    4
    Par défaut
    Kamoulox.
    Ou bien 42 ?
    La question ne veut rien dire.
    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
    Nouveau candidat au Club
    Homme Profil pro
    Apprenti C++
    Inscrit en
    Juillet 2019
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Congo-Kinshasa

    Informations professionnelles :
    Activité : Apprenti C++

    Informations forums :
    Inscription : Juillet 2019
    Messages : 2
    Par défaut Connaitre le nombre de chiffre après la virgul e?
    j'ai peut-etre mal posé ma question,mais pour creer une classe virgule_fixe j'ai besoi de connaitre grace a un std::string le nombre de chiffre apres la virgule(si float vaut 5.xyz [le nombre de chiffre après virgule donc ici 3,pas la valeur])et le mettre dans un int ,donc je vous demande comment connaitre le nombre de chiffre après la virgule ?
    vous pouvait m'aider svp?

  4. #4
    Rédacteur/Modérateur


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

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 145
    Billets dans le blog
    4
    Par défaut
    float représente les entiers relatifs, noté R en mathématiques et ces chiffres ont une infinité de chiffres après la virgule.
    Le format binaire ne permet pas ça mais ne permet pas non plus d'avoir une valeur précise pour l'immense majorité des valeurs possibles.
    Si tu veux afficher X chiffres après la virgule tu utilises la syntaxe de formatage d'affichage de std::ostream ou printf.
    Si tu veux stocker des valeurs à virgule fixe, je l'ai fait ici https://bousk.developpez.com/cours/s...n-avancee/#LII
    Si tu veux juste prendre 3 chiffres après la virgule, il suffit de multiplier par 1000
    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.

  5. #5
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 748
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 748
    Par défaut
    J'ai regardé vite fait mais je pense que c'est 1 truc impossible.
    Tu peux le savoir avec les nombres appartenant à D, mais pas à R (et sûrement 1 partie de Z) - lien wiki sur les nombres décimaux en français
    c'est à dire tous les nombres ayant 1 nombre fini de chiffres après la virgule et pas infini comme pi ou 1/3.

    Il faut prendre la mantisse/ la significande d'1 nombre flottant et chercher le dernier bit mis à 1 (le plus à droite) - le nombre de chiffres après la virgule est la différence entre le nombre de chiffres exposant et cet index.

    Rappel , d'après la norme IEEE 754, un nombre flottant est de la forme signe (1 ou -1) * base (2) ^ (exposant - biais) * 1,{mantisse/ significande}

  6. #6
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2018
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 21
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2018
    Messages : 25
    Par défaut
    bonjour a tous svp en voyant ce sujet jai essayer moi aussi d’aider mai je suis tomber face a un petit problème:

    jai réussi a créer un code qui donnait le nombre de chiffre après la virgule mais ne pouvait pas donner plus de 6 est ce un problème de surcharge


    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
     
     
    int apres_virgule( double a)
    {
    //on creer dabord une chaine caractere elle conservera  le nombre apres la virgule
         std::ostringstream chaine("");
    //on cree un variable  qui tranformeraa en entier de tel sorte que quon ai uniquement la partie entiere
        int b =a;
     //on cree une autre variable  en  faisant a-b il nous reste que le nombre decimal apresla virgule
        float c=a-b;
       // on  cree un variable nombre qui  retournera le nombre de chriffre apres la virgule a la fin dela fontion
        int nombre;
        //on transforme le  nombre decimal stocke dans c en chaine
        chaine<<c;
        //on compte le nombre de   lettre dans cette meme chaine
       nombre=(chaine.str().size())-2;
       //on retourne le nombre de  lettre
       return nombre;
     
     
    }

  7. #7
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 599
    Par défaut
    Bonjour,

    Avant de rechercher les chiffres après la virgule, il faut comprendre ce que sont les types float et double.

    Quand on dit nombre, on pense souvent aux nombres dits réels. Ça inclut par exemple 42, 1/8, 1.1875, 2/3, 0.1, pi, racineCarrée(2). Les float et double ne peuvent pas stocker certains de ces nombres, ils peuvent mémoriser la valeur exacte de 42, 1/8, 1.1875, mais seulement une valeur approchée de 2/3, 0.1, pi, racineCarrée(2).
    Un sous-ensemble des réels est l'ensemble des rationnels. Il inclut 42, 1/8, 1.1875, 2/3, 0.1 mais pas pi, racineCarrée(2). Les deux derniers ne peuvent pas écrits sous forme de fraction.
    Un sous ensemble des rationnels est l'ensembles des décimaux, il correspond au cas où le diviseur est une puissance de dix. Il inclut 42=42/1, 1/8=125/1000, 1.1875=11875/10000, 0.1=1/10. Il n'a pas 2/3, pi, racineCarrée(2). Et les float et double ne peuvent pas stocker tous les décimaux, il manque par exemple le 0.1. Oui, un nombre aussi simple que 0.1 ne peut être stocké que par une valeur proche comme 2/3 et pi!
    Il existe un autre sous ensemble des rationnels, ce sont les fractions dyadiques. il correspond au cas où le diviseur est une puissance de 2. Les dyadiques de ma liste exemple sont 42=42/1, 1/8=1/8, 1.1875=19/16. Tiens cette fois la liste correspond exactement à ce que peuvent stocker les float et double.
    Les float et double ne peuvent stocker exactement que les fractions dyadique (mais pas toutes!)

    Revenons sur le nombre 0.1. Comment est-ce possible, un nombre aussi simple ne peut pas être stocké exactement? Pourtant si j'écris :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    float x = 2./3.;               // 2/3 est converti en float
    std::cout << x << std::endl;   // ça affiche une approximation 0.666667
    float y = 0.1;                 // 0.1 décimal est converti en float
    std::cout << y << std::endl;   // ça affiche bien 0.1
    Car les fonctions d'affichage et de conversion des float et double veulent les rendre lisibles pour les humains et donc les fournissent en base 10 et donnent une valeur arrondies (par défaut std::cout cherche les 6 premiers chiffres décimaux arrondis.)
    On va demander d'afficher les même nombres en forçant une précision de 60 chiffres
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    float x = 2./3.;               // 2/3 est converti en float
    std::cout << std::setprecision(60) <<  x << std::endl; // ça affiche 0.666666686534881591796875
    float y = 0.1;                 // 0.1 décimal est converti en float
    std::cout << y << std::endl;   // ça affiche 0.100000001490116119384765625
    float u = 123456789;           // 123456789 décimal est converti en float
    std::cout << u << std::endl;   // ça affiche 123456792
    Eh oui, le 0.1 est connu comme une approximation ayant 27 chiffres! Eh oui, 12345689 est devenu 123456792
    Le point commun visible est que les 7 ou 8 premiers chiffres sont bons mais au delà ça semble être n'importe quoi.
    Les nombres sont mémorisés en binaire. Par exemple le 0.1 est mémorisé comme la formule binaire :
    0.000110011001100110011001101

    Donc un nombre float ne peut stocker qu'une approximation qui a un peu plus de 6 chiffres significatifs.
    Les double ont le même problème mais ont beaucoup plus de chiffres décimaux (53 au lieu de 23), donc un nombre double stocker une approximation qui a un peu plus de 15 chiffres significatifs.
    On ne pourra donc jamais compter sur le 7ième chiffre d'un float et sur le 16ième chiffre d'un double.

    On ne doit normalement pas utiliser le type float car on perd beaucoup en précision, on gagne un peu en taille mais très souvent il est en plus plus lent que le type double. Il faut donc une très bonne radine raison pour utiliser des float.

  8. #8
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2018
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 21
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2018
    Messages : 25
    Par défaut
    merci

  9. #9
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 82
    Par défaut ah les puristes !
    Même si je ne comprend pas l'utilité de ce que vous voulez faire, la réponse me semble assez simple :
    - vous créez une chaine avec :printf(tp, %f, votre variable)
    - vous récupérez un pointeur sur le séparateur décimal (normalement une ',' n'en déplaise aux thuriféraires de l’américanisation .. je sais printf ...)
    - vous avancez votre pointeur d'un caractère
    - vous appelez strlen(lePointeur) et vous avez le nombre de décimales - qui ne vous sert à rien.

    Ceci doit être adapté si votre système utilise UTF16.

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

Discussions similaires

  1. Ne laisser que 2 nombres aprés la virgule ou le point et supprimer les autres
    Par mystro7200 dans le forum Général JavaScript
    Réponses: 17
    Dernier message: 18/07/2008, 18h16
  2. Limité les nombres après la virgule
    Par touchkad dans le forum Langage
    Réponses: 4
    Dernier message: 17/09/2007, 10h37
  3. Limiter les nombres après la virgule
    Par lebigboss dans le forum Langage
    Réponses: 3
    Dernier message: 24/07/2007, 11h39
  4. Comment limiter le nombre apres la virgule?
    Par pierrot10 dans le forum Langage
    Réponses: 2
    Dernier message: 25/10/2006, 22h12
  5. [Math]Récupérer le premier nombre après la virgule
    Par am.adnane dans le forum Général Java
    Réponses: 4
    Dernier message: 01/12/2005, 14h05

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