C++ Chiffres d'un float

Résolu
Crazy Legs Messages postés 635 Date d'inscription   Statut Membre Dernière intervention   -  
Crazy Legs Messages postés 635 Date d'inscription   Statut Membre Dernière intervention   -
Bonsoir, j'ai besoin de compter le nombre de chiffres d'un float.

Si j'ai 13.56 je veux que ma fonction me retourne 4.

J'ai déjà fait quelque chose mais j'ai des erreurs de calculs dues à une perte progressive de la précision.

J'était parti de l'idée de décomposer mon nombre en deux.
Soit nb le nombre float que j'envoie à la fonction (13.56).

int n = nb; // Comme c'est un int, il vaut maintenant 13.
double m = nb - n; // 0.56.

Je boucle sur n ...

for(taille1 = 1 ; n > 1 ; n /= 10) taille1++;

... puis sur m pour compter le nombre de chiffres de chaque parties.
C'est sur m que la perte de précision arrive.
Mon algorithme est de multiplier m par 10 tant qu'il ne vaut pas un int (donc qu'il n'ait plus de virgule) :

0.56
5.6
56 -> int

Sauf qu'au lieu de s'arrêter à 56, il s'arrète à 560000 parfois, cela dépend du nombre en paramètre (et donc de la précision je pense).

Si vous avez une meilleure idée, à part déclarer des unsigned long double ^^
Merci.



J'aide les personnes qui ont un problème dans certaines sections du forums.

3 réponses

KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
Un float est un nombre, seul sa représentation a des chiffres.

Par exemple 0.56 = 0.560 = 0.5600 = 0.56000
Voilà pourquoi avec ta méthode tu as parfois 56, parfois 56000 !

Remarque on peut aussi dire que c'est égal à 5.6e-1, dans ces cas là ça n'a pas de sens de parler du nombre de chiffre du float !

Si tu veux calculer le nombre de chiffres significatifs de la représentation, tu peux manipuler une chaîne de caractère :

#include <sstream>

int nombreChiffres(const float x)
{
    std::ostringstream oss;
    oss << x;
    std::string s=oss.str();

    int n=0;
    for (int i=0; i<s.size(); i++)
    {
        switch (s[i])
        {
        case 'e' : return n; // on ne compte pas les chiffres de l'exposant
        case '-' : break;
        case '.' : break;
        default : n++; // les chiffres
        }
    }
    return n;
}
0
Crazy Legs Messages postés 635 Date d'inscription   Statut Membre Dernière intervention   98
 
Intéressant, je regarde ça de suite :)
Merci !
0
Crazy Legs Messages postés 635 Date d'inscription   Statut Membre Dernière intervention   98
 
Génial, j'avais effectivement pensé à mettre le nombre dans une chaîne, mais je ne connaissais pas sstream. Merci beaucoup :D
0