Page 1 sur 2

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

Publié : jeu. 29/mai/2014 14:14
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

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

Publié : jeu. 29/mai/2014 17:11
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 ...

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

Publié : jeu. 29/mai/2014 18:10
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


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

Publié : jeu. 29/mai/2014 20:01
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

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

Publié : jeu. 29/mai/2014 23:05
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+

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

Publié : ven. 30/mai/2014 7:11
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 

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

Publié : ven. 30/mai/2014 7:44
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+

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

Publié : ven. 30/mai/2014 7:49
par kernadec
WOW 8O 8O
j' aurai pas imaginé un truc pareil :?
merci PAPIPP

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

Publié : ven. 30/mai/2014 8:04
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: :)

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

Publié : ven. 30/mai/2014 8:38
par Micoute
Non, non, tu peux rester, c'est très intéressant ce que tu expliques !

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

Publié : ven. 30/mai/2014 8:38
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

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

Publié : ven. 30/mai/2014 10:16
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] :)

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

Publié : ven. 30/mai/2014 13:26
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 ?

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

Publié : ven. 30/mai/2014 13:28
par Micoute
kernadec a écrit : je travaille sur un procédé pour rajeunir
Tu me donnes la recette ?

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

Publié : ven. 30/mai/2014 15:45
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+