Bug d'algo incompréhensible !

Résolu
violent_ken Messages postés 1812 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 26 octobre 2010 - 13 nov. 2005 à 14:15
violent_ken Messages postés 1812 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 26 octobre 2010 - 13 nov. 2005 à 16:25
Violent Ken

Salut à toi, Ô grande communauté de développeurs !
Plus sérieusement, j'ai un problème tout simple, mais je ne trouve pas la réponse; le voilà :

J'ai ce petit bout de code :

(N est un Double que l'utilisateur donne, et Fac un Double =0)
Fac = 0
While Int(N) < N
Fac = Fac + 1
N = 10 * N
DoEvents
Wend

Voici ce que c'est censé faire : on donne N (qui est un nombre décimal) et la boucle nous le multiplie par 10 jusqu'à ce qu'il soit entier.
exemple : si N=1.05, on aura N qui deviendra 105 et Fac=2.
Pas trop dur, n'est ce pas !
MAIS, pour N=1.12, ma boucle me donne N=1.12E+16 et Fac=16 ! Pourquoi donc ???
Pour N=20.451, le résultat est le bon, mais pour N=1.12, pas moyen ??

J'ai donc trouvé le stratagème de faire :

While Len(Str$(Int(N))) < Len(Str$(N))

au mieux du While existant.
Ca marche désormais, mais ou est le bug dans la précédente boucle ??
Si vous trouvez pas, c'est pas grave, mais quand même, c'est incompréhensible et j'aimerais bien connaître le raison de ce bug ! Est ce vb6.exe qui foire ??
@+

5 réponses

cs_CanisLupus Messages postés 3757 Date d'inscription mardi 23 septembre 2003 Statut Membre Dernière intervention 13 mars 2006 20
13 nov. 2005 à 16:15
Salut, effectivement, le double en vb6 est très imprécis après un certain nombre de décimales (je crois que 14 c'est le max, à voir). Certaines valeurs comme 1.12 (et d'autres) prennent un 1 en 15ème décimale et plus. Le pourquoi ? pb de processeur, de conversion, ... ?

Pour ton prob, essaie cette solution :

While Int(N) < Round(N, 8)
Fac = Fac + 1
N = 10 * Round(N, 8)
DoEvents
Wend

J'ai mis Round(N, 8) mais tu peux mettre moins ou plus (mais pas plus de 14), ça dépend de la précision que tu veux obtenir. Je te laisse tester.

Je sais bien que le round... se répète mais autrement ça plante quand même car le double remet ses décimales parasites à chaque calcul.

-------------------------------------------------
Dresseur de puces, .... normal pour un loup !?
3
Neo.balastik Messages postés 796 Date d'inscription jeudi 17 mai 2001 Statut Membre Dernière intervention 5 mai 2009 7
13 nov. 2005 à 14:46
Salut ;O)

En utilisant le type de données Currency, ca passe. Maintenant, je n'explique pas pourquoi ce ne va pas avec Double.

Guy
0
violent_ken Messages postés 1812 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 26 octobre 2010 2
13 nov. 2005 à 14:50
Violent Ken

Effectivement, le fait que Fac aille jusqu'à 16 indique la limite du type de données. MAIS
1) pourquoi çà marche pas avec Double ???
2) pourquoi çà marche avec 1.05 ; 1.65152 et pas 1.12 ???

Quand même bizarre tout çà ...
@+
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
13 nov. 2005 à 15:59
salut,
étrange en effet. While (Int(N) + 0.01) < N faisable...
++
PCPT [AFCK]
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
violent_ken Messages postés 1812 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 26 octobre 2010 2
13 nov. 2005 à 16:25
Violent Ken

Fac=0
While Len(Str$(Int(N))) < Len(Str$(N))
Fac = Fac + 1
N = 10 * N
DoEvents
Wend

Cette petite boucle marche aussi; quand les longueurs des chaînes sont identiques, cela signifie que la virgule a disparu.
Quant à la solution avec le round, çà marche aussi (8 est convenable), merci !
@+
0
Rejoignez-nous