Incomprehensible !!!!

cs_makefcna Messages postés 17 Date d'inscription jeudi 10 juin 2004 Statut Membre Dernière intervention 26 mars 2008 - 9 nov. 2005 à 13:34
cosmobob Messages postés 700 Date d'inscription mardi 30 décembre 2003 Statut Membre Dernière intervention 27 janvier 2009 - 9 nov. 2005 à 16:21
Voici un problème que je ne comprend pas :

double valeur;
double valeur2,

valeur=156825;
valeur2=156.825;
valeur=valeur/1000;

if (valeur==valeur2)
{
// traitement
}

Le traitement n'est pas effectué !!!
En revanche si valeur vaut 156826 et valeur2 vaut156.826 alors le traitement est effectué !!!

Merci

4 réponses

DeAtHCrAsH Messages postés 2670 Date d'inscription vendredi 25 janvier 2002 Statut Membre Dernière intervention 6 février 2013
9 nov. 2005 à 14:06
Il bug a mort codes sources ces temps ci !!!!

Ton code est juste.
Je sais pas si une faute de frappe, mais après double valeur2 tu dois mettre un ";" et non pas une virgule.

Shell
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
9 nov. 2005 à 14:16
ATTENTION, double et float sont d'une grande imprécision.
'==' n'est jamais garanti, il vaut mieux comparer sur une plage restreinte:
>= && <=

ciao...
http://dev.winsysdev.com
BruNews, MVP VC++
0
ricky78 Messages postés 126 Date d'inscription jeudi 5 juin 2003 Statut Membre Dernière intervention 11 juillet 2006
9 nov. 2005 à 14:56
Bonjour

Mathématiquement l'infini n'est pas atteignable et pourtant

si X = 0.999999......
alors 10X = 9.9999999......

si je fait la deuxieme - la premiere

j'ai 10X - X = 9.99999999.... - 0.999999999

soit 9X = 9 d'ou X=1 et pourtant il valait 0.9999999 au départ

donc pour les float et double c'est pareil et tu n'a bien entendu pas une infinité de décimal en C suis donc les bons conseils de Brunews.

TOCHE
0
cosmobob Messages postés 700 Date d'inscription mardi 30 décembre 2003 Statut Membre Dernière intervention 27 janvier 2009 4
9 nov. 2005 à 16:21
non mais ca a rien a voir ce que tu dis ricky, puisque 1 =
0.9999999.... (pour s'en convaincre calculer la somme de la série de
terme generale un = 9.10^-n... ca vaut bien 1)

le truc est que effectivement comme dit brunews, les opérations sur les
float et les doubles ne sont pas d'une précision parfaite, sauf si tu
ne manipules QUE des puissances de 2 ce qui n'est pas le cas ds ton
exemple. si tu prends un float, que tu le divises par 100, et que tu le
remultiplies par 100, tu ne vas pas tomber exactement sur le meme
resultat. par contre la différence entre le premier float et le dernier
sera faible (< 10^-7 pour un calcul simple sur les float)



a+
0
Rejoignez-nous