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

Pour discuter de l'assembleur
PAPIPP
Messages : 534
Inscription : sam. 23/févr./2008 17:58

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

Message 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+
Il est fort peu probable que les mêmes causes ne produisent pas les mêmes effets.(Einstein)
Et en logique positive cela donne.
Il est très fortement probable que les mêmes causes produisent les mêmes effets.
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

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

Message 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
Avatar de l’utilisateur
microdevweb
Messages : 1798
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

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

Message 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 

Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Avatar de l’utilisateur
Vera
Messages : 45
Inscription : sam. 12/sept./2015 10:31
Localisation : Allemagne

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

Message 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
Faites-moi savoir, s'il vous plaît, si mon français n'est pas assez compréhensible. ~ merci ~
Le texte encadré est d'un traducteur.
Avatar de l’utilisateur
Kwai chang caine
Messages : 6962
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

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

Message 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
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Avatar de l’utilisateur
SPH
Messages : 4722
Inscription : mer. 09/nov./2005 9:53

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

Message 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
http://HexaScrabble.com/
!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.00 - 64 bits
Avatar de l’utilisateur
Ar-S
Messages : 9472
Inscription : dim. 09/oct./2005 16:51
Contact :

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

Message 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 

~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
Micoute
Messages : 2522
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

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

Message par Micoute »

Bonjour PAPIPP,

W10 x64 - PB 5.40 LTS Béta 10 x86

même résultat que les autres.
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 5.73 PB 6.00 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
PAPIPP
Messages : 534
Inscription : sam. 23/févr./2008 17:58

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

Message 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+
Il est fort peu probable que les mêmes causes ne produisent pas les mêmes effets.(Einstein)
Et en logique positive cela donne.
Il est très fortement probable que les mêmes causes produisent les mêmes effets.
Avatar de l’utilisateur
Micoute
Messages : 2522
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

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

Message 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
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 5.73 PB 6.00 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Répondre