Here are 2 prg that work properly
Code: Select all
Macro _q_t_
"
EndMacro
Macro _n (__n)
_q_t_#__n#=_q_t_+Str(__n)+" "
EndMacro
Macro _d (__D,__nv=8)
_q_t_#__D#=_q_t_+StrD(__D,__nv)+" "
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
Code: Select all
Macro _q_t_
"
EndMacro
Macro _n (__n)
_q_t_#__n#=_q_t_+Str(__n)+" "
EndMacro
Macro _d (__D,__nv=8)
_q_t_#__D#=_q_t_+StrD(__D,__nv)+" "
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
Debug "**** avec conversion *.q c'est OK !!!!! "
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 corrects
factd.d=fact(i) ;
Debug _n(fact(i))+_n(vall/fact(i))+_n(resl)+_n(factd)+_n(vall/factd)
Next
It must pass through an intermediate variable.
Or convert of data *.q or * .l of val or res but does not support the type * .d
Either ASM prg is incorrect or there is an error in the output of a real number.