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 -
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.
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
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 :
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; }