Salut,
je voudrais tester dans une condition si un double contient des chiffres après la virgule. Je voudrais donc une condition du style : true si mon double casté en int garde la même valeur.
Merci d'avance
Version imprimable
Salut,
je voudrais tester dans une condition si un double contient des chiffres après la virgule. Je voudrais donc une condition du style : true si mon double casté en int garde la même valeur.
Merci d'avance
static_cast -> int. Tu testes ensute si le delta est inférieur à un certain seuil en valeur absolue.
Hmm, je ne vois pas d'autres moyens que de décomposer ton double puis de déterminer si c'est un entier en fonction de certains tests sur ses composantes.
Mais faire ça de manière portable, c'est difficile.
Après tu peux toujours passer par la représentation décimale.
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 #include <iostream> #include <sstream> int main() { double d = 5.2; int i; std::stringstream ss; ss << d; if(ss >> i && ss.peek() == EOF) { std::cout << "C'est un entier : " << i << std::endl; } else { std::cout << "Ce n'est pas un entier" << std::endl; } }
Salut,
En fait, ça dépend de ce que tu veux savoir.
S'il s'agit de savoir si ton double "mériterait" d'être entier, il me semble que tu peux te contenter de le static_caster, et de le comparer àMais ce n'est peut-être pas ça ton problème. Si, par exemple, tu veux savoir si son affichage via une istringstream serait à virgule, le test précédent ne donnera pas forcément le bon résultat.Code:std::numeric_limits<double>::epsilon();
Pour preuve, le code :
AfficheCode:
1
2
3
4 double d = 9.9999999; std::cout << d << std::endl; std::cout << (d - static_cast<double>(static_cast<int>(d)) < std::numeric_limits<double>::epsilon()?"C'est entier":"Ca n'est pas entier") << std::endl;
Citation:
10
Ca n'est pas entier
C'est pas plus simple de faire comme ça?
Désolé si ça parait débutant, mais pourquoi utiliser des écritures compliquées avec les statinc int et cast? Une autre particularité du C++?Code:
1
2
3
4
5 double d = 92.02 if ((double)(int)d == d) cout << "c'est un entier" << endl; else cout << "c'est pas un entier" << endl;
Casts : http://c.developpez.com/faq/cpp/?pag...s#DIVERS_castsCitation:
Désolé si ça parait débutant, mais pourquoi utiliser des écritures compliquées avec les statinc int et cast? Une autre particularité du C++?
Comparaison de flottants : http://c.developpez.com/faq/cpp/?pag...ions_flottants
epsilon ne s'utilise pas comme cela. Il indique la différence entre le nombre représentable le plus proche supérieur à 1 et 1. Les flottants ayant une précision relative relativement constante, ta méthode a un problème pour les nombres plus grand que 2 -- où elle ne va jamais retourner que c'est un entier -- et pour les nombres plus petits que 0.5 où elle va retourner que c'est parfois un entier quand ce n'est pas le cas.Citation:
Envoyé par Feriaman
Pour les casts, voir la réponse de Laurent.Citation:
Envoyé par coyotte507
A noter qu'il y a un problème quand les flottants se mettent à dépasser ce qui est représentable dans un int.
Cette FAQ a le problème qu'elle contribue à faire croire que numeric_limits::epsilon peut être utilisé tel quel dans ce genre de circonstance.Citation:
Envoyé par Laurent Gomila
où err est choisi en fonction de l'erreur autorisée.Code:abs(a-b) <= err*max(abs(a), abs(b))*numeric_limit::epsilon
Citation:
Envoyé par gletare
me semble être la solution la plus robuste avec d qui est dans une variable.Code:floor(d) == d
C'est noté, je suis justement en train de préparer la prochaine mise à jour.Citation:
Envoyé par Jean-Marc.Bourguet
:merci:
En effet, je dois admettre que c'est une erreur de ma part.Citation:
Envoyé par Jean-Marc.Bourguet
Toutes mes excuses pour ce code qui est faux.