Optimisation convertion Radian/Degré

Programmation d'applications complexes
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Optimisation convertion Radian/Degré

Message 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)
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: Optimisation convertion Radian/Degré

Message 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
@+
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Re: Optimisation convertion Radian/Degré

Message 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 
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: Optimisation convertion Radian/Degré

Message 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.
PAPIPP
Messages : 534
Inscription : sam. 23/févr./2008 17:58

Re: Optimisation convertion Radian/Degré

Message 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+
Il est fort peu probable que les mêmes causes ne produisent pas les mêmes effets.(Einstein)
Et en logique positive cela donne.
Il est très fortement probable que les mêmes causes produisent les mêmes effets.
Avatar de l’utilisateur
Fig
Messages : 1176
Inscription : jeu. 14/oct./2004 19:48

Re: Optimisation convertion Radian/Degré

Message 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 ??
Il y a deux méthodes pour écrire des programmes sans erreurs. Mais il n’y a que la troisième qui marche.
Version de PB : 6.00LTS - 64 bits
Avatar de l’utilisateur
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

Re: Optimisation convertion Radian/Degré

Message 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 )
_________________________________________________
Mon site : CeriseCode (Attention Chantier perpétuel ;))
Répondre