flagyg
Messages postés50Date d'inscriptionsamedi 1 septembre 2001StatutMembreDernière intervention20 septembre 2006
-
20 sept. 2006 à 20:01
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 2021
-
21 sept. 2006 à 10:47
Bonsoir!!
Voilà je codais tranquillement mon code quand tout à coup quelque chose de trés fâcheux s'est produit :
T est une variable de type single qui vaut 0.00082 au moment ou je teste. J est 1 variable long mais c'est pas important.
Voilà mon code
Do
If T <= 10 And T >= 1 Then Exit Do 'quand T est entre 1 et 10, on quitte
If Nombre > 10 Then
T = T / G
J = J + 1
ElseIf Nombre < 10 Then
J = J - 1
T = T * G
End If
DoEvents
Loop
La multiplication par 10 se fait bien, une, deux .. mais hop à la troisième multiplication voila que T est égal non pas à 0.82 mais à 0.8200001 !!!!! C'est quoi Ca ??? lol on dirait comme des registres pas remis à 0.. j ai essayé de mettre le nombre "10" en constant single histoire de tout initialiser mais non, rien à faire.. savez-vous d'ou ca provient? PS: au cas ou, je n ai pas de service pack ..
Merci infiniment de votre réponse!! elle me sera trés précieuse parce que là vraiment il y a quelque chose qui m'échappe!!!
mortalino
Messages postés6786Date d'inscriptionvendredi 16 décembre 2005StatutMembreDernière intervention21 décembre 201117 20 sept. 2006 à 20:54
Salut,
ta variable ne doit pas être en Single, mais de type double.
De plus, je t'ai fait une simplification de ton code :
Private Sub Form_Load()
Dim T As Double ' en Double, pas en Single
Dim Nombre As Long
Dim J As Long
Dim G As Long
T = 0.00082
Nombre = 5
G = 10
Do
Select Case T
Case 1 To 10: Exit Do
Case Else: If Nombre > 10 Then T = T / G: J = J + 1 _
Else J = J - 1: T = T * G
End Select
'DoEvents
Loop
End Sub
@++
<hr width="100%" size="2" />
--Mortalino--
Le mystérieux chevalier, "Provençal, le Gaulois"
/DIV>
Dolphin Boy
Messages postés630Date d'inscriptionvendredi 5 mai 2006StatutMembreDernière intervention17 février 2007 20 sept. 2006 à 21:01
Salut, je crois que ça vient de l'incertitude dans la précision de ce genre de type de donnée en VB6.
Avec single, elle se situe entre
-1,401298E-45 et 1,401298E-45.
Avec Double, elle se situe entre
-4,94065645841247E-324 et 4,94065645841247E-324
Dans ton cas, choisis le type Double pour ta variable T et ça devrait le faire (précision imparfaite aussi mais suffisante pour tes calculs je pense)
mortalino
Messages postés6786Date d'inscriptionvendredi 16 décembre 2005StatutMembreDernière intervention21 décembre 201117 20 sept. 2006 à 21:16
Casy : d'avoir le résultat voulu !!
J'ai testé ça façon, et effectivement le résultat est comme il a dit, avec la variable en Double, le résultat est correct.
J'ai regardé, des erreurs se produisent si le nombre, de type Single, est compris entre -1,4 et 1,4.
@++
<hr width="100%" size="2" />
--Mortalino--
Le mystérieux chevalier, "Provençal, le Gaulois"
/DIV>
Vous n’avez pas trouvé la réponse que vous recherchez ?
(à virgule flottante en simple précision),
4 octets,
-3,402823E38 à -1,401298E-45 pour les valeurs négatives ; 1,401298E-45 à 3,402823E38 pour les valeurs positives,
----
Double
(à virgule flottante en double précision),
8 octets,
-1,79769313486231E308 à
-4,94065645841247E-324 pour les valeurs négatives ; 4,94065645841247E-324 à 1,79769313486232E308 pour les valeurs positives,
----
Currency
(entier à décalage),
8 octets,
-922 337 203 685 477,5808 à 922 337 203 685 477,5807
@++
<hr width="100%" size="2" />
--Mortalino--
Le mystérieux chevalier, "Provençal, le Gaulois"
/DIV>
flagyg
Messages postés50Date d'inscriptionsamedi 1 septembre 2001StatutMembreDernière intervention20 septembre 2006 20 sept. 2006 à 21:45
Ah oui!!!! Merci beaucoup pour ces réponses!!!! comme quoi on en apprends tout les jours..j' avais jamais remarqué que faire une multiplication par 10 entrainait une imprécision..j'avais toujours obtenu un nombre exact. Bon je n'ai pas l'habitude d'utiliser des nombres à virgules.. ben merci beaucoup..Mais plutôt que d'utiliser un double, je vais plutôt remplacer le "égal" par une soustraction et une comparaison avec + ou- 0 ..Merci beaucoup en tout cas!!!Vive ce site extra et ses utilisateurs qui le sont tout autant!