Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

EXPONENTIATION RAPIDE


Information sur la source

Catégorie :Maths Classé sous : exponentiation, exposants, tempsdeprocédure, vérificationdonnées Niveau : Débutant Date de création : 26/11/2005 Date de mise à jour : 26/11/2005 16:57:13 Vu / téléchargé: 4 219 / 148

Note :
7,5 / 10 - par 4 personnes
7,50 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (6)
Ajouter un commentaire et/ou une note

Description

Cliquez pour voir la capture en taille normale
Ce code donne la valeure de l'exposant d'un nombre, l'ordre de grandeur et la rapidité sont de l'ordre de l'exposant pas défaut de Windows, il est possible de le vérifier avec le zip qui contient les deux facons de calculer et qui mesure le temps d'execution.

MERCI A PCPT POUR QueryPerformance AINSI QUE POUR SES NOMBREUSES CONTRIBUTIONS SUR LE FORUM VBFRANCE.
 

Source

  • Function EXPO(x As String, n As Integer) As String
  • r = 1 'initialisation de ce qui sera le résultat
  • If n = 0 Then
  • EXPO = 1
  • End If
  • 'Nous prendrons par convention 0^0=1
  • Do
  • If n Mod 2 = 0 Then
  • n = n / 2
  • x = x * x
  • Else: n = (n - 1) / 2
  • r = r * x
  • If n <> 0 Then
  • x = x * x
  • End If
  • End If
  • Loop While n <> 0
  • 'Cette méthode est tres simple à comprendre sur un exemple
  • '13^5, 5 est impair et 13^5 = 13*(13^2)^2
  • EXPO = r
  • End Function
Function EXPO(x As String, n As Integer) As String

r = 1  'initialisation de ce qui sera le résultat

If n = 0 Then
   EXPO = 1
End If

'Nous prendrons par convention 0^0=1


Do


   If n Mod 2 = 0 Then
      n = n / 2
      x = x * x
      
   Else: n = (n - 1) / 2
      r = r * x
      
      If n <> 0 Then
         x = x * x
      
      End If
     
   End If
   
   
Loop While n <> 0


'Cette méthode est tres simple à comprendre sur un exemple
'13^5,  5 est impair et 13^5 = 13*(13^2)^2


EXPO = r


End Function

Conclusion

Cette méthode est assez rapide mais elle n'est pas parfaite, en la mettant sur ce sit je veux bien sur la partager mais j'espere aussi qu'on me donnera des conseils afin d'améliorer encore la vitesse de calcul.
 

Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

Historique

26 novembre 2005 16:57:14 :
oubli

Commentaires et avis

signaler à un administrateur
Commentaire de DARKSIDIOUS le 26/11/2005 16:16:33 administrateur CS

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.

DarK Sidious

signaler à un administrateur
Commentaire de PCPT le 26/11/2005 16:19:58 administrateur CS

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]

signaler à un administrateur
Commentaire de Julien39 le 26/11/2005 16:53:11

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.

signaler à un administrateur
Commentaire de DARKSIDIOUS le 26/11/2005 17:13:35 administrateur CS

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

signaler à un administrateur
Commentaire de violent_ken le 27/11/2005 11:15:42

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à !
@+

signaler à un administrateur
Commentaire de us_30 le 27/11/2005 13:56:31

Bonjour,

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.

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

Comment ecrire des exposants chimique [ par aercilla ] Je m'explique :On m'a demander de pouvoir inserer des exposants chimique avant et apres un charactere classic.exemple : A² ou ²B² (désoler, je ne sa


Nos sponsors

Sondage...

CalendriCode

Décembre 2008
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

Consulter la suite du CalendriCode



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,312 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.