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+