PureBasic

Forums PureBasic
Nous sommes le Ven 20/Sep/2019 2:34

Heures au format UTC + 1 heure




Poster un nouveau sujet Répondre au sujet  [ 3 messages ] 
Auteur Message
 Sujet du message: Reglage resultat sortant d'une procedure
MessagePosté: Mer 07/Oct/2009 14:24 
Hors ligne
Avatar de l’utilisateur

Inscription: Jeu 09/Nov/2006 13:41
Messages: 67
Localisation: PACA
Bonjour à tous.

Voila j'utilise dans un code une procedure Combinaisons / C(n,p):
(sans doute issue du forum, je n'ai pas retrouve le post si tel est le cas)

Code:
Procedure.d Combinations(n.l, p.l)

  ;si n négatif pas de combinaisons
  !TEST dword [p.v_n], $80000000
  !JNE  l_combinations_end

  ;si p négatif pas de combinaisons
  !TEST dword [p.v_p], $80000000
  !JNE  l_combinations_end

  ;si n inférieur à p pas de combinaisons
  !MOV eax, dword [p.v_n]
  !CMP eax, dword [p.v_p]
  !JL  l_combinations_end

  !FLD1 ;résultat dans st0
   
  ;si p > n/2
  !SHR eax, 1
  !CMP eax, dword [p.v_p]
  !JG l_combinations_loop

  ;on prend n - p à la place de p
  !MOV eax, dword [p.v_n]
  !SUB eax, dword [p.v_p]
  !MOV dword [p.v_p], eax

  combinations_loop:
  ;tant que p > 0
  !CMP dword [p.v_p], 0
  !JLE l_combinations_end_loop

  ;calcule les combinaisons
  !FIMUL dword [p.v_n]
  !FIDIV dword [p.v_p]
  !DEC   dword [p.v_n]
  !DEC   dword [p.v_p]

  !JMP l_combinations_loop
  combinations_end_loop:

  !FRNDINT
  combinations_end:

  !RET 8
EndProcedure



Cela fonctionne bien tant que n>=p, et que les valeurs soient positives.
Dans mon utilisation de cette procedure, il arrive parfois que les valeurs p ou n données fournissent un resultat negatif ou donnant "-1.#IND".

Comment modifier le code ASM pour avoir comme resultat 0, si le calcul ne donne pas une resultante positive ?

Merci à tous


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Reglage resultat sortant d'une procedure
MessagePosté: Jeu 08/Oct/2009 9:57 
Hors ligne

Inscription: Sam 23/Fév/2008 17:58
Messages: 556
Bonjour Ganagyre
Je ne sais si cela te convient
Voici un code ASM qui répond 0 dans tous les cas non positif
Code:
Procedure.d Combinations(n.l,p.l)
    !FINIT
    !FLDZ
 
  ;si n négatif pas de combinaisons
  !TEST dword [p.v_n], $80000000
  !JNE  l_combinations_end

  ;si p négatif pas de combinaisons
  !TEST dword [p.v_p], $80000000
  !JNE  l_combinations_end

  ;si n inférieur à p pas de combinaisons
  !MOV eax, dword [p.v_n]
  !CMP eax, dword [p.v_p]
;  !JL  l_combinations_end
    !JNL  l_combin_suite
    !NOP
    !FLDZ
    !jmp l_combinations_end
combin_suite:

  !FLD1 ;résultat dans st0
   
  ;si p > n/2
  !SHR eax, 1
  !CMP eax, dword [p.v_p]
  !JG l_combinations_loop

  ;on prend n - p à la place de p
  !MOV eax, dword [p.v_n]
  !SUB eax, dword [p.v_p]
  !MOV dword [p.v_p], eax

  combinations_loop:
  ;tant que p > 0
  !CMP dword [p.v_p], 0
  !JLE l_combinations_end_loop

  ;calcule les combinaisons
  !FIMUL dword [p.v_n]
  !FIDIV dword [p.v_p]
  !DEC   dword [p.v_n]
  !DEC   dword [p.v_p]

  !JMP l_combinations_loop
  combinations_end_loop:

  !FRNDINT
  combinations_end:

  !RET 8
EndProcedure
For n=0 To 10
For p=0 To 10
; For p=0 To n
d.d=combinations(n,p)
Debug d
;  Debug f_n(d)+ f_n(n)+f_n(p)
Next
Next


A+
Encore plus simple
Code:
Procedure.d Combinations(n.l,p.l)
    !FINIT
    !FLDZ
 
  ;si n négatif pas de combinaisons
  !TEST dword [p.v_n], $80000000
  !JNE  l_combinations_end

  ;si p négatif pas de combinaisons
  !TEST dword [p.v_p], $80000000
  !JNE  l_combinations_end

  ;si n inférieur à p pas de combinaisons
  !MOV eax, dword [p.v_n]
  !CMP eax, dword [p.v_p]
  !JL  l_combinations_end
  !FLD1 ;résultat dans st0
  ;si p > n/2
  !SHR eax, 1
  !CMP eax, dword [p.v_p]
  !JG l_combinations_loop

  ;on prend n - p à la place de p
  !MOV eax, dword [p.v_n]
  !SUB eax, dword [p.v_p]
  !MOV dword [p.v_p], eax

   combinations_loop:
  ;tant que p > 0
  !CMP dword [p.v_p], 0
  !JLE l_combinations_end_loop

  ;calcule les combinaisons
  !FIMUL dword [p.v_n]
  !FIDIV dword [p.v_p]
  !DEC   dword [p.v_n]
  !DEC   dword [p.v_p]

  !JMP l_combinations_loop
  combinations_end_loop:

  !FRNDINT
  combinations_end:

  !RET 8
EndProcedure
For n=0 To 10
For p=0 To 10
; For p=0 To n
d.d=combinations(n,p)
Debug d
;   Debug f_n(d)+ f_n(n)+f_n(p)
Next
Next




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.


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Reglage resultat sortant d'une procedure
MessagePosté: Ven 09/Oct/2009 13:19 
Hors ligne
Avatar de l’utilisateur

Inscription: Jeu 09/Nov/2006 13:41
Messages: 67
Localisation: PACA
Bonjour.

PAPIPP, grand merci pour ces 2 amelioration de la Procedure Combinations.

+


Haut
 Profil  
Répondre en citant le message  
Afficher les messages postés depuis:  Trier par  
Poster un nouveau sujet Répondre au sujet  [ 3 messages ] 

Heures au format UTC + 1 heure


Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 1 invité


Vous ne pouvez pas poster de nouveaux sujets
Vous ne pouvez pas répondre aux sujets
Vous ne pouvez pas éditer vos messages
Vous ne pouvez pas supprimer vos messages

Rechercher:
Aller à:  
cron

 


Powered by phpBB © 2008 phpBB Group | Traduction par: phpBB-fr.com
subSilver+ theme by Canver Software, sponsor Sanal Modifiye