Ecart das calculs

bonjour , j'ai saisi le bout de code suivant et trouve des anomalies de calcul

Sub angle_neg_pos() sig = Array("+", "-") x = sig(Rnd * (3 / 2)) & Rnd * 360 ' retourne un angle choisi aléatoirement entre 0 et 360° sens trigo ou anti trigo y = sig(Rnd * (3 / 2)) & Rnd * 360 ' retourne un angle choisi aléatoirement entre 0 et 360° sens trigo ou anti trigo z = sig(Rnd * (3 / 2)) & Rnd * 360 ' retourne un angle choisi aléatoirement entre 0 et 360° sens trigo ou anti trigo t = Array(x, y, z) 'je realise un tableau de mes resultats For j = 0 To UBound(t) w = w & " " & t(j) Next 'je verifie le contenu MsgBox w For u = 0 To UBound(t) If t(u) < 0 Then t(u) = Replace(t(u), Val(t(u)), 360 + Val(t(u))) ' si un angle est negatif je le remplace par 360 + angle negatif End If Next MsgBox t(0) & " " & t(1) & " " & t(2) ' le nouveau tableau doit me donner que des mesures positives mais les calculs fait par la machines sont imprecis End Sub

d'apres vous qu'est ce qui justiferai cette imprécision ?

Merci pour vos réponses

Bonjour,

Tu définis sig comme un tableau de 2 valeurs : sig(0) = "+" et sig(1) = "-"

Je décroche donc dès le départ sur sig(Rnd * (3 / 2)) ??? qui va renvoyer quasi systématiquement le signe - !

Bonjour,

t(u) = Replace(t(u), Val(t(u)), 360 + Val(t(u)))    ' si un angle est negatif je le remplace par 360 + angle negatif

Heuuu, un esprit moins torturé aurait écrit :

t(u) = 360 + Val(t(u)

non ?

Si tu typais tes variables tu n'aurais pas des "-255.2536" mais des -255.2536 (Double), quand même plus logiques.

Maintenant si tu ne donnes aucun exemple de ce que tu considères comme une imprécision on ne peut fournir aucune explication.

eric

PS : si tu pouvais éditer ton post initial et utiliser la balise code </> stp

Merci mFerrand et eric , comme imprécisions j'obtenais pour premieres valeurs exemples :

-56,98 - 183,25 + 130.44 cette serie devient ensuite +304 + 177 +130,44 alors que cela devrait etre (360-56.98 , 360-183,25 , 130,44) soit donc ( +303,02 +176.75 130,44)

'j'ai remodifié le programme comme suit :

Sub angle_neg_pos()
Dim x, y, z As Double
Randomize
sig = Array("+", "-")
x = sig(Int(Rnd * (3 / 2))) & Round(Rnd * 360, 2)
y = sig(Int(Rnd * (3 / 2))) & Round(Rnd * 360, 2)
z = sig(Int(Rnd * (3 / 2))) & Round(Rnd * 360, 2)
t = Array(x, y, z)
For j = 0 To UBound(t)
  w = w & " " & t(j)
Next
MsgBox w
 For u = 0 To UBound(t)
  If Val(t(u)) < 0 Then
   't(u) = Replace(t(u), Val(t(u)), Round(360 + Val(t(u)), 2))
   t(u) = 360 + Val(t(u))
  End If
 Next
MsgBox t(0) & " " & t(1) & " " & t(2)

End Sub

Re,

Par rapport au point que j'avais soulevé, je mettrais sig(Int(Rnd * 2)), qui te fournira sig(0) ou sig(1) de façon équiprobable.

Re,

Salut MFerrand,

c'est sans doute voulu cette répartition je pense.

Pour info val ne connait que le . en séparateur décimal. Pour lui tout ce qui est au-delà d'une , n'existe plus.

Je réitère donc : type tes variables :

Sub angle_neg_pos()
    Dim x As Double, y As Double, Z As Double
    sig = Array("+", "-")
    x = sig(Rnd * (3 / 2)) & Rnd * 360    ' retourne un angle choisi aléatoirement entre 0 et 360° sens trigo ou anti trigo
    y = sig(Rnd * (3 / 2)) & Rnd * 360    ' retourne un angle choisi aléatoirement entre 0 et 360° sens trigo ou anti trigo
    Z = sig(Rnd * (3 / 2)) & Rnd * 360    ' retourne un angle choisi aléatoirement entre 0 et 360° sens trigo ou anti trigo
    t = Array(x, y, Z)    'je realise un tableau de mes resultats
    For j = 0 To UBound(t)
        w = w & " " & t(j)
    Next    'je verifie le contenu
    MsgBox w
    For u = 0 To UBound(t)
        If t(u) < 0 Then
            t(u) = 360 + t(u)    ' si un angle est negatif je le remplace par 360 + angle negatif
        End If
    Next
    MsgBox t(0) & " " & t(1) & " " & t(2)    ' le nouveau tableau doit me donner que des mesures positives mais les calculs fait par la machines sont imprecis
End Sub

Et je supprimerai l'array sig pour n'utiliser que des fonctions mathématiques :

    x = Sgn(Rnd - (1 / 3)) * Rnd * 360    ' retourne un angle choisi aléatoirement entre 0 et 360° sens trigo ou anti trigo
    y = Sgn(Rnd - (1 / 3)) * Rnd * 360    ' retourne un angle choisi aléatoirement entre 0 et 360° sens trigo ou anti trigo
    Z = Sgn(Rnd - (1 / 3)) * Rnd * 360    ' retourne un angle choisi aléatoirement entre 0 et 360° sens trigo ou anti trigo

eric

Pas mal Eriic ,!!! merci pour cette réponse élégante !

et merci à M.Ferrand pour son indication

Ben tu pourrais répondre à sa question posée 2 fois quand même. Qu'on sache !

Et j'ajouterai que je ne comprend rien à ton calcul.

Tu génères des angles, 2/3 de 0 à 360, 1/3 de 0 à -360 que tu ramènes de 0 à 360.

Ce qui devrait donc te faire les 3/3 des angles (donc tous) de 0 à 360 non ?

Elle est où la faille dans mon raisonnement ? (j'ai des excuses, il est tard)

Bonsoir eric , dans ma démarche j'ai tout simplement choisi de facon aleatoire un signe + ou - et un réel compris entre 0 et 360 °

mais bon j'ai tenu de vos remarques sur la facon de procéder qui etait jusque la trop lourde et vous en remercie

trop lourde ...pour ma facon de faire

..j'ai testé la fréquence d'otiention du signe "-" avec la suggestions faite par Eriic pour l'affectation du signe en reprenant

Rnd - (1 / 3)

et en ayant ecrit le bout de code suivant :

Randomize
Do
z = Rnd - (1 / 3)
If z < 0 Then
  n = n + 1
End If
i = i + 1
Loop Until i = 1000000
MsgBox n / 1000000
End Sub

sur 1 000 000 d'essais la fréquence d'obtention du "moins " n'est que de 33,3 % est ce suffisant ...

merci

Rechercher des sujets similaires à "ecart das calculs"