C++ Chiffres d'un float

Résolu/Fermé
Crazy Legs Messages postés 635 Date d'inscription jeudi 10 avril 2008 Statut Membre Dernière intervention 27 septembre 2016 - Modifié par Crazy Legs le 10/12/2010 à 19:11
Crazy Legs Messages postés 635 Date d'inscription jeudi 10 avril 2008 Statut Membre Dernière intervention 27 septembre 2016 - 10 déc. 2010 à 21:29
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 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
10 déc. 2010 à 20:12
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 jeudi 10 avril 2008 Statut Membre Dernière intervention 27 septembre 2016 98
10 déc. 2010 à 21:25
Intéressant, je regarde ça de suite :)
Merci !
0
Crazy Legs Messages postés 635 Date d'inscription jeudi 10 avril 2008 Statut Membre Dernière intervention 27 septembre 2016 98
10 déc. 2010 à 21:29
Génial, j'avais effectivement pensé à mettre le nombre dans une chaîne, mais je ne connaissais pas sstream. Merci beaucoup :D
0