OVH Cloud OVH Cloud

Single, double, .....

16 réponses
Avatar
TouTi
Bonjour

Je n'y comprends plus rien....

Je travaille sur des valeurs décimales d'une précision pouvant aller à 8
chiffres après la virgule. Je décide donc de définir les données au type
Double. Mais j'ai des problèmes au niveau du résultat, exemple :

Private Sub Command1_Click()
Dim angle As Integer, tour As Integer, i As Double
Dim angdes As Double, angdeb As Double, angG As Double
tour = 360
angle = 0
angG = tour / 14

For i = 0 To tour Step angG
angdeb = angle + i
MsgBox angdeb & "/" & i
If angdeb = 360 Then MsgBox "toto"
Next i
End Sub

1) Déjà au niveau de la boucle, la valeur i ne va pas jusque 360?????.
Pourtant angG * 14 = 360 .....
Il faudrait que le rajoute par exemple 1 à tour : For i = 0 To tour +1 Step
angG ????? mais ce n'est pas souhaitable..

2) Même si je modifie l'entrée de la boucle, la conditionnelle ne s'effectue
pas lorsque angdeb = 360 ??????. Il faudrait que je modifie int(angdeb)
malheureusement je perds de la précision pour les autres valeurs

3) Si je passe tous les types Double en Single cela fonctionne mais je perd
de la précision et ce n'est pas souhaitable

Une petite explication serait souhaitable et comment résoudre ce
problème?????

Merci

--
Guy

10 réponses

1 2
Avatar
Aski
Salutatoi TouTi,

Utilise Double pour toutes les variables.

Tu as donc déclaré :

Bonjour

Je n'y comprends plus rien....

Je travaille sur des valeurs décimales d'une précision pouvant aller
à 8 chiffres après la virgule. Je décide donc de définir les données
au type Double. Mais j'ai des problèmes au niveau du résultat,
exemple :
Private Sub Command1_Click()
Dim angle As Integer, tour As Integer, i As Double
Dim angdes As Double, angdeb As Double, angG As Double
tour = 360
angle = 0
angG = tour / 14

For i = 0 To tour Step angG
angdeb = angle + i
MsgBox angdeb & "/" & i
If angdeb = 360 Then MsgBox "toto"
Next i
End Sub

1) Déjà au niveau de la boucle, la valeur i ne va pas jusque 360?????.
Pourtant angG * 14 = 360 .....
Il faudrait que le rajoute par exemple 1 à tour : For i = 0 To tour
+1 Step angG ????? mais ce n'est pas souhaitable..

2) Même si je modifie l'entrée de la boucle, la conditionnelle ne
s'effectue pas lorsque angdeb = 360 ??????. Il faudrait que je
modifie int(angdeb) malheureusement je perds de la précision pour
les autres valeurs
3) Si je passe tous les types Double en Single cela fonctionne mais
je perd de la précision et ce n'est pas souhaitable

Une petite explication serait souhaitable et comment résoudre ce
problème?????

Merci


Avatar
TouTi
> Salutatoi TouTi,
Utilise Double pour toutes les variables.



Salut
C'est la même chose.... rien ne va


--
Guy
Avatar
TouTi
En plus, il parait que le type Decimal existe (vu ds msdn) mais VB ne veut
pas le déclarer

*Dim valeur as decimal* n'est pas admis ??????

--
Guy
Avatar
Drizzit
Si toute fois tu connais le nombre de cycle (14), tu peux faire comme
ça :

For i = 0 To 14
angdeb = angG * i
MsgBox angdeb & "/" & i
If angdeb = 360 Then MsgBox "toto"
Next i

et là l'égalité est bonne...
Avatar
Aski
Salutatoi TouTi,

Tu as donc déclaré :

En plus, il parait que le type Decimal existe (vu ds msdn) mais VB ne
veut pas le déclarer

*Dim valeur as decimal* n'est pas admis ??????



Tu remplaces ta boucle par
j = 0
Do
i = i + angG
angdeb = angle + i
MsgBox angdeb & "/" & i
If angdeb = 360 Then MsgBox "toto"
Loop Until angdeb > 360

sans modification des variables et cela fonctionne
Avatar
TouTi
> For i = 0 To 14


> angdeb = angG * i
> MsgBox angdeb & "/" & i
If angdeb = 360 Then MsgBox "toto"
Next i



Oui c'est d'accord

mais je ne peux pas utiliser cette méthode

--
Guy
Avatar
TouTi
> Tu remplaces ta boucle par
j = 0
Do
i = i + angG
angdeb = angle + i
MsgBox angdeb & "/" & i
If angdeb = 360 Then MsgBox "toto"
Loop Until angdeb > 360



Ah bah oui c'est certain... mais je ne comprends pas avec la boucle For cela
passe en single et pas en Double?

Merci
--
Guy
Avatar
TouTi
Par contre la conditionnelle ne fonctionne pas????

--
Guy
Avatar
Aski
Salutatoi TouTi,

Tu as donc déclaré :

Tu remplaces ta boucle par
j = 0
Do
i = i + angG
angdeb = angle + i
MsgBox angdeb & "/" & i
If angdeb = 360 Then MsgBox "toto"
Loop Until angdeb > 360



Ah bah oui c'est certain... mais je ne comprends pas avec la boucle
For cela passe en single et pas en Double?



Remplace
angdeb = angle + i
par
angdeb = angdeb + i

sinon angle ne sert à rien


Merci


Avatar
Vincent Guichard
TouTi a écrit :
Bonjour



Bonsoir,

Bien que rien dans la documentation de For ne l'empêche, j'aurais
tendance à déconseiller l'utilisation de For avec des valeurs autres que
entières. Les propagations des erreurs d'arrondi peuvent très bien faire
que les 14 additions successives réalisées par le for donnent un total
différent de celui attendu.

Le fait que cela marche avec des single et pas avec des doubles montre
juste que l'arrondi réalisé sur le calcul se propage différemment dans
un cas et dans l'autre (normal, puisque la précision n'est pas la même).

Il faut bien comprendre que la valeur 360.0/14.0 exacte ne peux pas être
mémorisée dans un double.

Vincent Guichard
1 2