(Résolu) Calcul bizarre, est-ce que c'est un bug?

Sujets variés concernant le développement en PureBasic
Avatar de l’utilisateur
kernadec
Messages : 1606
Inscription : ven. 25/avr./2008 11:14

(Résolu) Calcul bizarre, est-ce que c'est un bug?

Message par kernadec »

bonjour
voilà, j'avais des erreurs dans un code en cherchant ce que c'était
je suis tombé sur un problème dont voici le code.
Testé sur PB 5.00 x86 et PB 5.22LTS x86 mêmes résultats
si quelqu'un peut m'expliquer merci.
Cordialement

Code : Tout sélectionner

Debug "----- premier test ----"
a.d + 1/360 
Debug " plus de décimales avec 0  " 
Debug a      
Debug ""
Debug " fraction"
a = a - Int(a)  ; l'extraction de la fraction ici fonctionne normal lol (utilisée avec zéro pour comparer avec le second test)
Debug  a
Debug "bon résultat "
Debug  a*360   

Debug "---- second test ----"
b.d = 1
b + 1/360 
Debug " il y a moins de décimales avec + 1 au depart ?" 
Debug b        ; problème de décimales par rapport au résultat de a

Debug " fraction"

b = b-Int(b)  ; dans ce cas l'extraction de la fraction est érronée  
Debug  b
Debug "résultat incorrect  ? "
Debug  b*360   ; resultat bizarre
Dernière modification par kernadec le ven. 30/mai/2014 8:41, modifié 2 fois.
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Re: Calcul bizarre, est-ce que c'est un bug?

Message par nico »

Je ne suis pas le mieux placé pour expliqué ce résultat, je sais juste que ce problème a déjà été abordé et qu'il a été dit que ce n'était pas un problème dû à PureBasic ...
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Calcul bizarre, est-ce que c'est un bug?

Message par Backup »

tu nous réinvente le Test Hebdogiciel :)
Les performances du TI-Basic testées par Hebdogiciel :

Un test amusant avait été fait sur l'hebdomadaire Hebdogiciel, n°61 de décembre 1984, dans l'article "20 ordinateurs sur le grill".
Voici le listing du programme de test:

10 A=2
20 FOR N=1 TO 20
30 A=SQR(A)
40 NEXT N
50 FOR N=1 TO 20
60 A=A^2
70 NEXT N
80 PRINT A

Le résultat doit normalement être 2 mais nos chères machines donnaient toutes un résultat faux. Un classement des micros fût fait, du plus approchant au plus éloigné. Le TI-99/4A, et l'EXL-100 arrivèrent en tête avec un résultat de 1.999999924. La raison en est simple, les calculs arithmétiques sont faits avec une précision de 14 chiffres sur le TI-99/4A, contre 8 chiffres pour la plupart des autres micro-ordinateurs de la même époque.

Les résultats du test:
Texas Instruments TI-99/4A 1.999999924
Exelvision EXL-100 1.999999924
Canon X-07 19999997741097
Canon V20 1.99999977
Yashica (MSX) 1.99999977
Amstrad 464/6128 1.999433
Atari 800XL 1.99765243
Sinclair ZX-81 2.000446
Sinclair Spectrum 2.000446
Apple //e 2.00232917
Apple //c 2.0023291
Commodore C64 2.00232917
Oric Atmos 2.00232917
Commodore Vic-20 2.00232917
Thomson MO5 2.00232917
Thomson TO7 2.16828
Thomson TO7/70 2.16828
Tandy TRS80 2.16828
Hector HRX 2.16927

Avatar de l’utilisateur
kernadec
Messages : 1606
Inscription : ven. 25/avr./2008 11:14

Re: Calcul bizarre, est-ce que c'est un bug?

Message par kernadec »

bonsoir
merci pour de vos réponses...
je ne pensais pas réinventer la roue désolé, je suis ennuyé avec ce problème de décimales.
et je n' essaye pas de faire le malin 8O

j'ai essayé avec une procédure et c'est pareil.
il y a vraiment un truc qui cloche avec la fonction int()
maintenant si on doit tenir compte que 6 décimales après la virgule, c'est bon ! mais pas pour moi 8O


Cordialement

Code : Tout sélectionner

Procedure.d Frac(Xfrac.d)   
	ProcedureReturn Xfrac-Int(Xfrac)    
EndProcedure   


Debug "----- premier test ----"
a.d + 1/360 
Debug " plus de décimales avec 0  " 
Debug a      
Debug ""
Debug " fraction"
a = a-Int(a)  ; l'extraction de la fraction ici fonctionne normal lol (utilisée avec zéro pour comparer avec le second test)
Debug  a
Debug "bon résultat "
Debug  a*360   

Debug "---- second test ----"
b.d = 1
b + 1/360 
Debug " il y a moins de décimales avec + 1 au depart ?" 
Debug b        ; problème de décimales par rapport au résultat de a

Debug " fraction"
 b=Frac(b)
;b = b - Int(b)  ; dans ce cas l'extraction de la fraction est érronée  
Debug  b
Debug "résultat incorrect  ? "
Debug  b*360   ; resultat bizarre
PAPIPP
Messages : 534
Inscription : sam. 23/févr./2008 17:58

Re: Calcul bizarre, est-ce que c'est un bug?

Message par PAPIPP »

Bonjour Kernadec

C'est un manque de précision dans le format flottant simple ou double précision soit avec les nombres décimaux soit avec des nombres très grands.
Le Pb a déjà été traité voir http://www.purebasic.fr/french/viewtopi ... nt#p115656
Voir ici pour la précision en gestion : http://www.purebasic.fr/french/viewtopi ... nt#p158229
Il existe des possibilités pour régler ce pb de précision mais avec des LIB.
par exemple http://www.purebasic.fr/french/viewtopi ... =6&t=14089
Il existe d'autres LIB pour traiter ces Pb de précision.

Voici un test pour montrer la différence entre simple et double précision.

Code : Tout sélectionner

Debug "test simple précision"
A.f=2
For N=1 To 20
A=Sqr(A)
Next 
For N=1 To 20
  A=A*A
  Debug a
  Debug StrF(A,18)

Next N
; Debug A  
; Debug StrF(A,18)

Debug "test double précision"
B.d=2
For N=1 To 20
B=Sqr(B)
Next 
For N=1 To 20
  B=B*B
  Debug B
  Debug StrD(B,18)

Next N
; Debug B
; Debug StrD(B,18)
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
kernadec
Messages : 1606
Inscription : ven. 25/avr./2008 11:14

Re: Calcul bizarre, est-ce que c'est un bug?

Message par kernadec »

Bonjour PAPIPP
merci pour ces liens intéressants.

PB donne une partie fraction avec moins de décimales quand n <> 0
.... 1 / 360 donne 0.0027777777777777779
1 + 1 / 360 donne 1.0027777777777778

Voilà une autre écriture du code pour contrer mon problème dans l'exemple qui suit:
car le retrait de l'entier avant ou pendant le calcul modifie la précision du reste.

Cordialement.

Code : Tout sélectionner

Debug "---- test avec retrait de l'entier avant ?----"
b.d + 1 / 360
b + 3    ; avec un grand nombre entier le résultat repasse au-dessus de 1 
e.d = b
Debug   " résultat imprécis suivant taille de l'entier "
b = (b - Int(b)) * 360  
Debug b            ; résultat imprécis
e = Mod(e,1) * 360
Debug e            ; resultat imprècis
Debug ""

Debug "----  test avec retrait de l'entier après ----"
c.d + 1 / 360 
c + 3             ; ajout d'un entier à la partie fraction
;Debug c
a = Int(c)        ; stock la partie entière du nombre
c * 360         
Debug c-(360*a)  ; retour a 1 
Debug ""

Debug "---- idem avec fonction modulo ----"
d.d + 1 / 360 
d + 3              ; ajout d'un entier à la partie fraction
;Debug d
d = d * 360
d = Mod(d,360)
Debug d           ; retour a 1 
PAPIPP
Messages : 534
Inscription : sam. 23/févr./2008 17:58

Re: Calcul bizarre, est-ce que c'est un bug?

Message par PAPIPP »

Bonjour Kernadec
C'est Debug qui donne le nombre de décimal
exemple :

Code : Tout sélectionner

Debug 1.0/360
Debug 1+1.0/360

; MAIS si l'on indique le nombre de décimal
debug "si l'on indique le nombre de décimal"
Debug StrD(1.0/360,18)
Debug StrD(1+1.0/360,18)
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
kernadec
Messages : 1606
Inscription : ven. 25/avr./2008 11:14

Re: Calcul bizarre, est-ce que c'est un bug?

Message par kernadec »

WOW 8O 8O
j' aurai pas imaginé un truc pareil :?
merci PAPIPP
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Calcul bizarre, est-ce que c'est un bug?

Message par Backup »

au passage , je tiens a préciser que PAPIPP
dans son test , reprends le fameux Test HebdoGiciel ;)

Image

ce test permettait de tester les ordinateurs 8 bits
pour ce qui concerne la précision de calcul

a l'epoque la vitesse etait plutot secondaire ...
donc, on regardais la precision.. fallait bien trouver quelque chose

partant de 2 , on faisait 20 fois la racine de 2 puis 20 fois puissance 2 , on devait retrouver un nombre le plus approchant de 2

dans ce que je cite, on peut voir des marques d'ordinateur dans les choux ...
les bonne unité de calcul n'etaient pas si courante a l'epoque :)

tout calcul, demande une place pour mettre la retenue....
si la place est limité , (les 8bits deja occupés).... forcement, le fait de ne pas pouvoir stocker la retenue
fini par creer une imprécision :)






bon je sort .... :mrgreen: :)
Avatar de l’utilisateur
Micoute
Messages : 2583
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Calcul bizarre, est-ce que c'est un bug?

Message par Micoute »

Non, non, tu peux rester, c'est très intéressant ce que tu expliques !
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 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Avatar de l’utilisateur
kernadec
Messages : 1606
Inscription : ven. 25/avr./2008 11:14

Re: Calcul bizarre, est-ce que c'est un bug?

Message par kernadec »

Merci Dobro
Pour la rétro sur HebdoGiciel dont j'ai encore quelques numéros dans ma cave, enfin je crois!

Maintenant c'est Cool, mon problème est Résolu, PAPIPP m'as ouvert les yeux sur Debug
et puis je vieilli 62ans, je suis peut être le doyen du forum :mrgreen:
donc ça s'arrange pas :? , mais je travaille sur un procédé pour rajeunir. :mrgreen:

merci à tous et bonne journée

cordialement
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Calcul bizarre, est-ce que c'est un bug?

Message par Backup »

kernadec a écrit : mais je travaille sur un procédé pour rajeunir. :mrgreen:
en temps normal, j'aurai eu tendance a te dire "haaaa ? là tu m'interesses ! :D "

mais finalement réflexions faites , j'ai bientôt 50 piges au compteur,
je me dis , "s'il faut que je supporte , encore 50 ans les cons qui m'entourent , je crois que finalement, la vie est bien faite ! :) "

[mode glauque ON]
juste , "pourvu que ça aille vite et sans douleurs"
[mode glauque OFF] :)
Avatar de l’utilisateur
Micoute
Messages : 2583
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Calcul bizarre, est-ce que c'est un bug?

Message par Micoute »

kernadec a écrit : je vieilli 62ans, je suis peut être le doyen du forum
eh non, j'ai 2 ans de plus que toi, qui dis mieux ?
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 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Avatar de l’utilisateur
Micoute
Messages : 2583
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Calcul bizarre, est-ce que c'est un bug?

Message par Micoute »

kernadec a écrit : je travaille sur un procédé pour rajeunir
Tu me donnes la recette ?
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 6.20 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: (Résolu) Calcul bizarre, est-ce que c'est un bug?

Message par PAPIPP »

Bonjour à tous.

Vous êtes tous de petits jeunes.
Je suis né au 20em siècle c'est-à-dire au siècle précédent en l’année 39 un 22 octobre juste quelque mois après la déclaration de guerre de la France contre l’Allemagne
Je vous laisse compter.
Par ailleurs mon pseudo est PAPIxx

Au revoir les enfants.
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.
Verrouillé