Bonjour à tous
Et merci à tous de vos réponses.
@Denis
Je n’ai pas PB64bits et je ne peux donc pas le tester mais je pense que c’est le retour ret 4 qui plante
Il y aurait une différence d’algo entre PB 32bits et PB 64bits.
J’ai modifié le programme avec un retour en PB peut-être que cela fonctionnera mieux.
Code : Tout sélectionner
Macro _q_t_
"
EndMacro
Macro _n (__n)
_q_t_#__n#=_q_t_+Str(__n)+" "
EndMacro
Procedure.d Fac(n.l)
EnableASM
FINIT
FLDZ
;si n négatif pas de combinaisons
TEST dword [p.v_n], $80000000
JNE fact_end1
FLD1 ;1 dans st0
;si n = 0 pas de combinaisons
CMP dword [p.v_n], 0
JLE fact_end1
!@@:
;calcule les combinaisons
FIMUL dword [p.v_n]
DEC dword [p.v_n]
;tant que n > 0
JNZ @b
!fact_end1:
DisableASM
ProcedureReturn
EndProcedure
Procedure.d Fact(n.l)
Protected retd.d
EnableASM
FINIT
FLDZ
;si n négatif pas de combinaisons
TEST dword [p.v_n], $80000000
JNE fact_end
FLD1 ;1 dans st0
;si n = 0 pas de combinaisons
CMP dword [p.v_n], 0
JLE fact_end_loop
!FACT_loop:
;calcule les combinaisons
FIMUL dword [p.v_n]
DEC dword [p.v_n]
;tant que n > 0
JNZ FACT_loop
!fact_end_loop:
!fact_end:
FSTP qword [p.v_retd]
DisableASM
ProcedureReturn retd
EndProcedure
val.d=1000
For i=0 To 5
res.d=val/fact(i); malgré des valeurs positives réelles le résultat est toujours ZERO ou 1
factd.d=fact(i) ; il faut passer par une variable intermédiaire pour obtenir un résultat
Debug _n(fact(i))+_n(val/fact(i))+_n(res)+_n(factd)+_n(val/factd)+_n(i)
res.d=val/fac(i); malgré des valeurs positives réelles le résultat est toujours ZERO ou 1
facd.d=fac(i) ; il faut passer par une variable intermédiaire pour obtenir un résultat
Debug _n(fac(i))+_n(val/fac(i))+_n(res)+_n(facd)+_n(val/facd)
Next
Mais on a toujours des résultats bizarres.
@Vera
Merci de cet essai qui permet de forcer la conversion en .long ce qui donne des résultats corrects.
Mais limités par une plage de -2147483648 à +2147483647 et si on les définit en .q la plage est de
-9223372036854775808 à +9223372036854775807 mais nous avons perdu le format scientifique propre a la définition des nombres réels.
Et de toute manière il y a une bizarrerie dans la gestion de sortie des nombres réels.
Code : Tout sélectionner
Macro _q_t_
"
EndMacro
Macro _n (__n)
_q_t_#__n#=_q_t_+Str(__n)+" "
EndMacro
Procedure.d Fact(n.l)
EnableASM
FINIT
FLDZ
;si n négatif pas de combinaisons
TEST dword [p.v_n], $80000000
JNE fact_end
FLD1 ;résultat dans st0
;si n inférieur à p pas de combinaisons
!FACT_loop:
;tant que n > 0
CMP dword [p.v_n], 0
JLE fact_end_loop
;calcule les combinaisons
FIMUL dword [p.v_n]
DEC dword [p.v_n]
JMP FACT_loop
!fact_end_loop:
; FRNDINT
!fact_end:
DisableASM
ProcedureReturn
EndProcedure
val.d=1000
For i=1 To 5
Debug val/fact(i)
res.d=val/fact(i); malgré des valeurs positives réelles le résultat est toujours ZERO
factd.d=fact(i) ; il faut passer par une variable intermédiaire pour obtenir un résultat
Debug _n(fact(i))+_n(val/fact(i))+_n(res)+_n(factd)+_n(val/factd)
Next
Debug " avec vall.l et resl.l tout devient correct !!!!"
vall.q=1000 ;; avec une definition .l ou .q les résultats sont corrects
For i=1 To 5
Debug vall/fact(i)
resl.q=vall/fact(i);;;; ; avec une definition .l ou .q les résultats sont exacts
factd.d=fact(i) ;
Debug _n(fact(i))+_n(vall/fact(i))+_n(resl)+_n(factd)+_n(vall/factd)
Next
Tout ceci pour remarquer que les prg suivants somme et pi en double réel fonctionnent correctement !!!
Code : Tout sélectionner
Macro _q_t_
"
EndMacro
Macro _n (__n)
_q_t_#__n#=_q_t_+Str(__n)+" "
EndMacro
Procedure.d PI_Double()
!FLDPI
; !ret
ProcedureReturn
EndProcedure
Procedure.d somme(a.d,b.d)
ProcedureReturn (a+b)
EndProcedure
vald.d=1000
Debug _d(pi_double())+_d(vald/pi_double())
som.d=5
For i=0 To 5
som+somme(2,i)
Debug _n(i)+_n(som)+_n(vald/somme(i,5))
Next
Il y a bien un pb dans la gestion des retours en nombre réel Peut-être est-ce mon prg qui n’est pas correct ? Mais je ne vois pas pourquoi.
A+