Faire une multiplication

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Faire une multiplication

Message par Dr. Dri »

retour à l'école primaire :lol:
(activez l'assembleur)

Code : Tout sélectionner

Procedure Mul(a.l, b.l)
  Protected Result.l, Sign.l
  
  If a < 0
    a = -a
    Sign + 1
  EndIf
  
  If b < 0
    b = -b
    Sign + 1
  EndIf
  
  Repeat
    If b & 1
      Result + a
    EndIf
    SHL a, 1
    SHR b, 1
  Until b = 0
  
  If sign = 1
    Result = -Result
  EndIf
  
  ProcedureReturn Result
EndProcedure

RandomSeed( ElapsedMilliseconds() )
For i = 1 To 10
  x = Random($79999999)
  y = Random($79999999)
  
  Debug Mul(x, y)
  Debug x * y
  Debug "------"
Next i
Dri 8)
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

Comparer deux nombres non signés

Code : Tout sélectionner

Procedure Cmp(a.l, b.l)
  Protected Result.l, i.l, aa.l, bb.l
  
  If a <> b
    i = 32
    While i
      i - 1
      
      aa = (a >> i) & 1
      bb = (b >> i) & 1
      
      If aa <> bb
        If aa
          Result = 1
        Else
          Result = -1
        EndIf
        i = 0
        a = b
      EndIf
      
    Wend
  EndIf
  
  ProcedureReturn Result
EndProcedure

x = $80000000
y = $00000015

Debug Cmp(x, y)

;comparaison signée
If x > y
  Debug "1"
ElseIf x < y
  Debug "-1"
Else
  Debug "0"
EndIf
Dri 8)
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

t'arrete pus !! :D
lionel_om
Messages : 1500
Inscription : jeu. 25/mars/2004 11:23
Localisation : Sophia Antipolis (Nice)
Contact :

Message par lionel_om »

Kler, il est parti le Dri.
J'crois il veut créer PB 4 :P :jesors:
Webmestre de Basic-univers
Participez à son extension: ajouter vos programmes et partagez vos codes !
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

La multiplication est signée donc techniquement elle sert à rien lol
sauf peut être à avoir un début pour une multiplication non signée ^^

j'ai besoin de nombres non signés pour un truc sur lekel je bosse en ce moment... alors comme j'y connais rien en assembleur je me débrouille en PB...

Dri
bombseb
Messages : 445
Inscription : jeu. 25/août/2005 22:59
Localisation : 974
Contact :

Message par bombseb »

je ne comprend pas l'interet de faire ca...c'est plus rapide ?
il n'y a pas de fonction dans PB pour faire ca ?
lionel_om
Messages : 1500
Inscription : jeu. 25/mars/2004 11:23
Localisation : Sophia Antipolis (Nice)
Contact :

Message par lionel_om »

Le "fonction" PB c'est : :10: :jesors:
Webmestre de Basic-univers
Participez à son extension: ajouter vos programmes et partagez vos codes !
bombseb
Messages : 445
Inscription : jeu. 25/août/2005 22:59
Localisation : 974
Contact :

Message par bombseb »

Le "fonction" PB c'est :
Code:
*
oui je sais bien, mais ca ne répond pas à ma question 8O
lionel_om
Messages : 1500
Inscription : jeu. 25/mars/2004 11:23
Localisation : Sophia Antipolis (Nice)
Contact :

Message par lionel_om »

La version PB sera surement plus rapide.
Et pour l'intérête : y'en a pas, à par le plaisir de coder la fonction :lol:
Webmestre de Basic-univers
Participez à son extension: ajouter vos programmes et partagez vos codes !
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

regarde la comparaison, tu vois bien que PB et ma fonction ne donnent pas le même résultat ?
C'est un problème de nombres signés ou non signés... Un nombre non signé est toujours positif. par exemple un octet non signé ira de 0 à 255. un octet signé pourra être négatif et aura une valeur entre -128 et 127.

Y'a une sacrée différence nan ? Surtout que la maintenant tout de suite ca m'arrangerai des nombres non signés et je sais pas comment on s'y prend pour en manipuler...

Une dernière chose... Les deux fonctions travaillent "bit à bit" ce qui permet de voir de quelle manière le processeur s'y prend pour les faire ;)

Dri
Répondre