Cet algo, semble être présent que 2 fois sur VBF, d'après mes recherches...
Amicalement,
Us.
violent_ken
Messages postés1812Date d'inscriptionmardi 31 mai 2005StatutMembreDernière intervention26 octobre 20102 27 nov. 2005 à 11:15
Salut !
Concernant les variables, il y a des problèmes de déclaration. Mais bon. Concernant l'algo en lui même, la vitesse est en effet équivalente à x^n directement calculé.
Je vous propose deux autres méthodes :
'1) calcul direct avec x^n=exp(n*ln(x))
Labresult.Caption = Exp(Txtexpo * Log(Txtnbr))
'2) x^n=x*x*x*...*x n fois
Function EXPO2(x As Long, n As Long) As Long
EXPO2 Abs((n > 0) + (n 0)): r = 1
While r < x
EXPO2 = EXPO2 * n
r = r + 1
Wend
End Function
Les vitesses sont là aussi équivalentes.
Cependant, une dernière remarque : il faut tester plusieurs fois les fonctions pour vraiment déterminer leur vitesse :
exemple :
Dim x As Long
Call QueryPerformanceCounter(TimeStart)
For x = 1 To 200000
Labresult.Caption = EXPO2(Txtexpo, Txtnbr)
Next x
Call QueryPerformanceCounter(TimeStop)
et bien sur compiler le tout pour avoir des temps réalistes.
Voilà !
@+
cs_DARKSIDIOUS
Messages postés15814Date d'inscriptionjeudi 8 août 2002StatutMembreDernière intervention 4 mars 2013130 26 nov. 2005 à 17:13
Non je veux dire que ce code est très connu des algorithmiciens, par forcément de VBFrancistes ;)
ben si tu veux un code un peu plus optimisé déjà :
Function EXPO(x As long, n As Integer) As long
Dim r As Long
r = 1
If n = 0 Then
EXPO = 1
Exit Function
End If
Do
If n Mod 2 = 0 Then
n = n / 2
x = x * x
Else
n = (n - 1) / 2
End If
r = r * x
If n <> 0 Then x = x * x
Loop While n <> 0
EXPO = r
End Function
Le typage des données est très important, s'il n'est pas fait correctement, ton algorithme sera forcément plus long à exécuter !
DarK Sidious
cs_Julien39
Messages postés6414Date d'inscriptionmardi 8 mars 2005StatutModérateurDernière intervention29 juillet 2020371 26 nov. 2005 à 16:53
J'ai vu cette méthode récemment mais je ne savais pas qu'elle était très connue, si elle est déjà très présente sur le site enlevez la source mais il ne me semble pas car je en l'ai jamais rencontrée, même si elle n'apporte rien au niveau de la vitesse on comprends mieux ce qui se passe du loins je pense.
PCPT : Pour les variables l'unique que je déclare en variant est obligatoirement déclarée comme ceci car c'est pour permettre une correction, les string au lieu des long permettent d'avoir une plus grande plage de valeur, pour les autres tu as raison mais j'ai du mal avec les variables.
Enfin Mea-culpa, j'aurai réparé l'oubli dès que la mise à jour sera effective.
PCPT
Messages postés13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201847 26 nov. 2005 à 16:19
rholala....
des variant? des int au lieu de long? des string au lieu long ou double.
le currency qui reçoit inutilement le retour du msgbox.. (donc un VbYes)...
ton code est entièrement à revoir. et à remettre en ordre également. très peu de procédures, mais dificilement lisible....
ps : un p'tit "merci" pour QueryPerformance m'aurait fait plaisir, mais bon....
(pas noté)
@+
PCPT [AFCK]
cs_DARKSIDIOUS
Messages postés15814Date d'inscriptionjeudi 8 août 2002StatutMembreDernière intervention 4 mars 2013130 26 nov. 2005 à 16:16
erf, ton algorithme est déjà connu depuis belle lurette, et je pense d'ailleurs qu'il s'agit de la meilleure solution actuellement.
Pourquoi tu n'obtiens pas la même rapidité que la fonction standard de VB ? Sûrement parce que la fonction standard est optimisée au max : codée en C (voir même assembleur), sûrement une gestion très réduite des erreurs etc.
Bref, faut pas trop croire qu'en VB, on trouve des fonctions plus rapide que les fonctions standard, bien qu'il suffit d'avoir une idée de génie parfois pour trouver un algorithme encore plus efficace que ceux déjà existants.
27 nov. 2005 à 13:56
Le code : http://www.vbfrance.com/code.aspx?ID=31388 me semble être meilleur, pour réaliser cet algo, même si il est encore un poil optimisable (mais pas beaucoup)...
Cet algo, semble être présent que 2 fois sur VBF, d'après mes recherches...
Amicalement,
Us.
27 nov. 2005 à 11:15
Concernant les variables, il y a des problèmes de déclaration. Mais bon. Concernant l'algo en lui même, la vitesse est en effet équivalente à x^n directement calculé.
Je vous propose deux autres méthodes :
'1) calcul direct avec x^n=exp(n*ln(x))
Labresult.Caption = Exp(Txtexpo * Log(Txtnbr))
'2) x^n=x*x*x*...*x n fois
Function EXPO2(x As Long, n As Long) As Long
EXPO2 Abs((n > 0) + (n 0)): r = 1
While r < x
EXPO2 = EXPO2 * n
r = r + 1
Wend
End Function
Les vitesses sont là aussi équivalentes.
Cependant, une dernière remarque : il faut tester plusieurs fois les fonctions pour vraiment déterminer leur vitesse :
exemple :
Dim x As Long
Call QueryPerformanceCounter(TimeStart)
For x = 1 To 200000
Labresult.Caption = EXPO2(Txtexpo, Txtnbr)
Next x
Call QueryPerformanceCounter(TimeStop)
et bien sur compiler le tout pour avoir des temps réalistes.
Voilà !
@+
26 nov. 2005 à 17:13
ben si tu veux un code un peu plus optimisé déjà :
Function EXPO(x As long, n As Integer) As long
Dim r As Long
r = 1
If n = 0 Then
EXPO = 1
Exit Function
End If
Do
If n Mod 2 = 0 Then
n = n / 2
x = x * x
Else
n = (n - 1) / 2
End If
r = r * x
If n <> 0 Then x = x * x
Loop While n <> 0
EXPO = r
End Function
Le typage des données est très important, s'il n'est pas fait correctement, ton algorithme sera forcément plus long à exécuter !
DarK Sidious
26 nov. 2005 à 16:53
PCPT : Pour les variables l'unique que je déclare en variant est obligatoirement déclarée comme ceci car c'est pour permettre une correction, les string au lieu des long permettent d'avoir une plus grande plage de valeur, pour les autres tu as raison mais j'ai du mal avec les variables.
Enfin Mea-culpa, j'aurai réparé l'oubli dès que la mise à jour sera effective.
26 nov. 2005 à 16:19
des variant? des int au lieu de long? des string au lieu long ou double.
le currency qui reçoit inutilement le retour du msgbox.. (donc un VbYes)...
ton code est entièrement à revoir. et à remettre en ordre également. très peu de procédures, mais dificilement lisible....
ps : un p'tit "merci" pour QueryPerformance m'aurait fait plaisir, mais bon....
(pas noté)
@+
PCPT [AFCK]
26 nov. 2005 à 16:16
Pourquoi tu n'obtiens pas la même rapidité que la fonction standard de VB ? Sûrement parce que la fonction standard est optimisée au max : codée en C (voir même assembleur), sûrement une gestion très réduite des erreurs etc.
Bref, faut pas trop croire qu'en VB, on trouve des fonctions plus rapide que les fonctions standard, bien qu'il suffit d'avoir une idée de génie parfois pour trouver un algorithme encore plus efficace que ceux déjà existants.
DarK Sidious