Page 1 sur 1

Reglage resultat sortant d'une procedure

Publié : mer. 07/oct./2009 14:24
par Ganagyre
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 : Tout sélectionner

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

Re: Reglage resultat sortant d'une procedure

Publié : jeu. 08/oct./2009 9:57
par PAPIPP
Bonjour Ganagyre
Je ne sais si cela te convient
Voici un code ASM qui répond 0 dans tous les cas non positif

Code : Tout sélectionner

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 : Tout sélectionner

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+

Re: Reglage resultat sortant d'une procedure

Publié : ven. 09/oct./2009 13:19
par Ganagyre
Bonjour.

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

+