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?????
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
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?????
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
TouTi
> Salutatoi TouTi, Utilise Double pour toutes les variables.
Salut C'est la même chose.... rien ne va
-- Guy
> Salutatoi TouTi,
Utilise Double pour toutes les variables.
> 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
> 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?
> 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
TouTi
Par contre la conditionnelle ne fonctionne pas????
-- Guy
Par contre la conditionnelle ne fonctionne pas????
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
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
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.
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.