Page 1 sur 1

Optimisation convertion Radian/Degré

Publié : ven. 09/sept./2011 17:33
par Le Soldat Inconnu
Salut,

Un petit code qui montre quel est le calcul le plus rapide pour convertir de degré en radian

Code : Tout sélectionner

#Max = 400000000
Dim Temps(10)

Temps(1) = ElapsedMilliseconds()

For i = 1 To #Max
	Calcul.f = Radian(i * 10) + 5
Next

Temps(2) = ElapsedMilliseconds()

For i = 1 To #Max
	Calcul.f = 10 * #PI / 180 * i + 5
Next

Temps(3) = ElapsedMilliseconds()

For i = 1 To #Max
	Calcul.f =  i * 10 * #PI / 180 + 5
Next

Temps(4) = ElapsedMilliseconds()

For i = 1 To #Max
	Calcul.f =  i * (10 * #PI / 180) + 5
Next

Temps(5) = ElapsedMilliseconds()

For i = 1 To #Max
	Calcul.f = (10 * #PI / 180) * i + 5
Next

Temps(6) = ElapsedMilliseconds()

; Affichage du résultat
For  i = 2 To 6
	If i > 2
		Texte.s + Chr(10)
	EndIf
	Texte.s + Str(Temps(i) - Temps(i - 1))
	If i > 2
		If (Temps(i) - Temps(i - 1)) > (Temps(2) - Temps(1))
			Texte + " ( x " + StrD((Temps(i) - Temps(i - 1)) / (Temps(2) - Temps(1)), 2) + " )"
		Else
			Texte + " ( / " + StrD((Temps(2) - Temps(1)) / (Temps(i) - Temps(i - 1)), 2) + " )"
		EndIf
	EndIf
Next
MessageRequester("Temps", Texte)
(en passant, on voit un problème du compilateur sur les 3 derniers calculs)

Donc le mieux est de multiplier directement par " * (#PI / 180) " sans oublier les parenthèses (problème compilateur)

Re: Optimisation convertion Radian/Degré

Publié : ven. 09/sept./2011 18:45
par G-Rom
Tu peut encore simplifier le calcul de cette manière :

Code : Tout sélectionner

rad.f = #PI / 180
Angle.f = Cos(45 * rad)

Debug Angle
@+

Re: Optimisation convertion Radian/Degré

Publié : ven. 09/sept./2011 22:51
par Le Soldat Inconnu
non, c'est le compilateur qui se charge de simplifier #PI / 180, c'est pour ça qu'il faut des parenthèses

Sinon, le mieux reste de passer par une constante je pense

Code : Tout sélectionner

#Rad = #PI / 180
Angle.f = Cos(45 * rad) 
	 
Debug Angle 

Re: Optimisation convertion Radian/Degré

Publié : ven. 09/sept./2011 22:58
par G-Rom
Logiquement non, puisque le compilateur remplace la constante par l'expression , comme les macros.

Rad.f = #pi/180
Angle.f = Cos(45 * rad)

cela se décompose grosso modo ainsi :

-Angle.f
-Egal
-cos
-45
-mul
-Valeur immédiate

alors que Angle.f = Cos(45 * (#pi/180)) il y a une division en plus.

Re: Optimisation convertion Radian/Degré

Publié : ven. 09/sept./2011 23:48
par PAPIPP
A LSI et G-Rom Bonjour
Cos(x) est toujours compris entre -1 et +1
-1<=cos(x)<=+1
évitez de donner comme variable Angle au résultat de cos(x) il peut y avoir confusion entre la valeur du cosinus et de son angle
car -infini <= angle <=+infini
d'autre part la constante est #rad et non rad

Code : Tout sélectionner

#Rad=#PI/180
COSA.f=Cos(45*#rad)
Debug COSA
A+

Re: Optimisation convertion Radian/Degré

Publié : mer. 28/sept./2011 20:41
par Fig
G ROM a écrit :Logiquement non, puisque le compilateur remplace la constante par l'expression , comme les macros.
Ca m'étonne ce que tu dis: Je pensais jusqu'ici que le compilateur calculait la valeur de la constante une fois pour toute et l'affectait à une case mémoire.
Tu es sûr ??

Re: Optimisation convertion Radian/Degré

Publié : lun. 03/oct./2011 21:01
par graph100
les constantes sont remplacés à la compilation ;) ce qui fait que c'est extrêmement rapide ! (Cependant, la valeur de #SizeInteger = SizeOf(Integer) dépend de l'architecture du pc de compilation ! par exemple )