Pb de mul. avec d nbre single

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

Messages postés
6786
Date d'inscription
vendredi 16 décembre 2005
Statut
Membre
Dernière intervention
21 décembre 2011
18
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>
Messages postés
630
Date d'inscription
vendredi 5 mai 2006
Statut
Membre
Dernière intervention
17 février 2007

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)
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
41
Mortalino, ça apporte quoi de passer la variable en Double ????

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

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!
Messages postés
17287
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
27 septembre 2021
73
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