Page 1 sur 1

Obtenez-vous les mêmes résultats que moi ?

Publié : mar. 13/oct./2015 10:36
par PAPIPP
Bonjour à tous

Avant de poster sur le forum anglais je voudrais savoir si vous obtenez les mêmes résultats que moi.
La bizarrerie est dans le passage par une variable intermédiaire pour obtenir un résultat.

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:
	RET 4
	DisableASM
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 
A+

Re: Obtenez-vous les mêmes résultats que moi ?

Publié : mar. 13/oct./2015 11:02
par Anonyme2
PB 5.40 b9 Seven Pro 64 bits

En x86
0.0
fact(i)=1 val/fact(i)=0 res=0 factd=1 val/factd=1000
0.0
fact(i)=2 val/fact(i)=0 res=0 factd=2 val/factd=500
0.0
fact(i)=6 val/fact(i)=0 res=0 factd=6 val/factd=167
0.0
fact(i)=24 val/fact(i)=0 res=0 factd=24 val/factd=42
0.0
fact(i)=120 val/fact(i)=0 res=0 factd=120 val/factd=8
en 64 bits ca plante ligne 28 'accès mémoire invalide' à l'adresse 0

Re: Obtenez-vous les mêmes résultats que moi ?

Publié : mar. 13/oct./2015 11:09
par microdevweb
PB 5.40 B10 X86

Code : Tout sélectionner

0.0
fact(i)=1 val/fact(i)=0 res=0 factd=1 val/factd=1000 
0.0
fact(i)=2 val/fact(i)=0 res=0 factd=2 val/factd=500 
0.0
fact(i)=6 val/fact(i)=0 res=0 factd=6 val/factd=167 
0.0
fact(i)=24 val/fact(i)=0 res=0 factd=24 val/factd=42 
0.0
fact(i)=120 val/fact(i)=0 res=0 factd=120 val/factd=8 

Pb 5.31 X86

Code : Tout sélectionner

0.0
fact(i)=1 val/fact(i)=0 res=0 factd=1 val/factd=1000 
0.0
fact(i)=2 val/fact(i)=0 res=0 factd=2 val/factd=500 
0.0
fact(i)=6 val/fact(i)=0 res=0 factd=6 val/factd=167 
0.0
fact(i)=24 val/fact(i)=0 res=0 factd=24 val/factd=42 
0.0
fact(i)=120 val/fact(i)=0 res=0 factd=120 val/factd=8 


Re: Obtenez-vous les mêmes résultats que moi ?

Publié : mar. 13/oct./2015 12:35
par Vera
Hi PAPIPP,
En utilisant ton code (en Linux), je reçois les mêmes résultats comme Denis et microdevweb.

Mais quand j'utilise val.l et res.l [long !] je reçois ce résultat:
1000.0
fact(i)=1 val/fact(i)=1000 res=1000 factd=1 val/factd=1000
500.0
fact(i)=2 val/fact(i)=500 res=500 factd=2 val/factd=500
166.6666666666666571927635232
fact(i)=6 val/fact(i)=167 res=167 factd=6 val/factd=167
41.6666666666666642981908808
fact(i)=24 val/fact(i)=42 res=42 factd=24 val/factd=42
8.3333333333333339254522798
fact(i)=120 val/fact(i)=8 res=8 factd=120 val/factd=8

Re: Obtenez-vous les mêmes résultats que moi ?

Publié : mar. 13/oct./2015 17:57
par Kwai chang caine
W7 v5.23 X86
0.0
fact(i)=1 val/fact(i)=0 res=0 factd=1 val/factd=1000
0.0
fact(i)=2 val/fact(i)=0 res=0 factd=2 val/factd=500
0.0
fact(i)=6 val/fact(i)=0 res=0 factd=6 val/factd=167
0.0
fact(i)=24 val/fact(i)=0 res=0 factd=24 val/factd=42
0.0
fact(i)=120 val/fact(i)=0 res=0 factd=120 val/factd=8

Re: Obtenez-vous les mêmes résultats que moi ?

Publié : mar. 13/oct./2015 18:29
par SPH
0.0
fact(i)=1 val/fact(i)=0 res=0 factd=1 val/factd=1000
0.0
fact(i)=2 val/fact(i)=0 res=0 factd=2 val/factd=500
0.0
fact(i)=6 val/fact(i)=0 res=0 factd=6 val/factd=167
0.0
fact(i)=24 val/fact(i)=0 res=0 factd=24 val/factd=42
0.0
fact(i)=120 val/fact(i)=0 res=0 factd=120 val/factd=8
win 7 x86

Re: Obtenez-vous les mêmes résultats que moi ?

Publié : mar. 13/oct./2015 22:12
par Ar-S
W10 x64 - PB 5.31 x86

Code : Tout sélectionner

0.0
fact(i)=1 val/fact(i)=0 res=0 factd=1 val/factd=1000 
0.0
fact(i)=2 val/fact(i)=0 res=0 factd=2 val/factd=500 
0.0
fact(i)=6 val/fact(i)=0 res=0 factd=6 val/factd=167 
0.0
fact(i)=24 val/fact(i)=0 res=0 factd=24 val/factd=42 
0.0
fact(i)=120 val/fact(i)=0 res=0 factd=120 val/factd=8 


Re: Obtenez-vous les mêmes résultats que moi ?

Publié : mer. 14/oct./2015 6:04
par Micoute
Bonjour PAPIPP,

W10 x64 - PB 5.40 LTS Béta 10 x86

même résultat que les autres.

Re: Obtenez-vous les mêmes résultats que moi ?

Publié : mer. 14/oct./2015 8:27
par PAPIPP
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+

Re: Obtenez-vous les mêmes résultats que moi ?

Publié : mer. 14/oct./2015 9:13
par Micoute
Toujour W10 x64 - PB LTS 5.40 x86

Résultats :
fact(i)=1 val/fact(i)=0 res=0 factd=1 val/factd=1000 i=0
fac(i)=1 val/fac(i)=0 res=0 facd=1 val/facd=1000
fact(i)=1 val/fact(i)=0 res=0 factd=1 val/factd=1000 i=1
fac(i)=1 val/fac(i)=0 res=0 facd=1 val/facd=1000
fact(i)=2 val/fact(i)=0 res=0 factd=2 val/factd=500 i=2
fac(i)=2 val/fac(i)=0 res=0 facd=2 val/facd=500
fact(i)=6 val/fact(i)=0 res=0 factd=6 val/factd=167 i=3
fac(i)=6 val/fac(i)=0 res=0 facd=6 val/facd=167
fact(i)=24 val/fact(i)=0 res=0 factd=24 val/factd=42 i=4
fac(i)=24 val/fac(i)=0 res=0 facd=24 val/facd=42
fact(i)=120 val/fact(i)=0 res=0 factd=120 val/factd=8 i=5
fac(i)=120 val/fac(i)=0 res=0 facd=120 val/facd=8