Pb de mul. avec d nbre single

flagyg Messages postés 50 Date d'inscription samedi 1 septembre 2001 Statut Membre Dernière intervention 20 septembre 2006 - 20 sept. 2006 à 20:01
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 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!!!

7 réponses

mortalino Messages postés 6786 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 21 décembre 2011 17
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>
0
Dolphin Boy Messages postés 630 Date d'inscription vendredi 5 mai 2006 Statut Membre Dernière intervention 17 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)
0
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
20 sept. 2006 à 21:02
Mortalino, ça apporte quoi de passer la variable en Double ????

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #
0
mortalino Messages postés 6786 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 21 décembre 2011 17
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>
0

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

Posez votre question
mortalino Messages postés 6786 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 21 décembre 2011 17
20 sept. 2006 à 21:20
Beh té, tant que je suis dessus, autant en faire profiter notre ami flagyg :





Type de données |
Taille d'enregistrement |
Plage |

----

Byte,
1 octet,
0 à 255,

----

Boolean,
2 octets,
True ou False,

----

Integer,
2 octets,
-32 768 à 32 767,

----

Long

(entier long),
4 octets,
-2 147 483 648 à 2 147 483 647,

----

Single

(à 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>
0
flagyg Messages postés 50 Date d'inscription samedi 1 septembre 2001 Statut Membre Dernière intervention 20 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!
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 71
21 sept. 2006 à 10:47
ok avec le typage en Double...
pour la simplification et sécurisation du code, mieux vaut :

    If G <> 0 And Nombre <> 10 Then
        Do Until T <= 10 And T >= 1
            If Nombre > 10 Then
                T = T / G
            Else
                T = T * G
            End If
        Loop
    End If

Renfield
Admin CodeS-SourceS- MVP Visual Basic
0
Rejoignez-nous