Page 1 sur 1
Problemes de virgules et d'arrondis...
Publié : mer. 21/mars/2007 14:09
par ThoT
Re bonjour tout le monde!
C'est re moi avec re un probleme :
En fait j'aurai besoin d'explications concernant les nombres decimaux, leur declaration, leur arrondi (0.00123456 => 0.0012), leur utilisation dans une boucle "for next" et globalement tout ce qu'il y a a savoir sur ces bêtes là en pure basic.
Merci d'avance!

Re: Problemes de virgules et d'arrondis...
Publié : mer. 21/mars/2007 14:29
par Backup
ThoT a écrit :leur utilisation dans une boucle "for next"
ça fait longtemps que je demande ça !! (Dr Dri aussi

)
et on attends toujours !
bien sur, bien sur, on peut utiliser While-Wend, mais c'est pas pareil
pas aussi conviviale

Publié : mer. 21/mars/2007 14:51
par Flype
il y a sans doute de quoi discuter pendant longtemps surtout concernant les arrondis, les normes d'arrondi etc...
mais pour faire simple voilà déjà quelques infos :
1/
Les nombres à virgule (les flottants) ne sont pas autorisés (en purebasic) dans les boucles FOR NEXT, il faut un entier (n'est ce pas dobro). Ceci dit une boucle FOR NEXT se simule facilement avec un WHILE WEND ou un REPEAT UNTIL.
2/
Il y a 2 types de flottants :
les FLOATS sur 32bits
les DOUBLES sur 64bits (bcp + précis)
3/
Ils se déclarent comme suit :
monFlottant32.f = 123.456 ; FLOAT
monFlottant64.d = 123456.789 ; DOUBLE
Parallèlement on a la même chose pour les entiers :
monEntier8.b = 123 ; BYTE
monEntier16.w = 12345 ; WORD
monEntier32.l = 123456 ; LONG
monEntier64.q = 123456789 ; QUAD
Publié : mer. 21/mars/2007 15:02
par minirop
et il ne faut pas perdre de vue la norme IEEE 754 :
http://fr.wikipedia.org/wiki/IEEE_754
Et que 1000*0.001 != 1
Publié : mer. 21/mars/2007 18:21
par ThoT
ok, merci pour le debut de cours.
Mais je ne comprend toujours pas un truc.
Avec ce code :
Debug 1.0/25
Repeat
evenement = WaitWindowEvent()
Until evenement = #PB_Event_CloseWindow
End
j'obtiens ca :
et avec celui là :
a.f = 0.1
b.f = 0.2
c.f = 3
Debug a+b
Debug c+a
Debug a*b
Debug a*c
Delay(5000)
End
j'obtiens ca :
Bizzare, non??
Publié : mer. 21/mars/2007 18:41
par minirop
non ce n'est pas bizarre, çà s'appelle une erreur d'arrondi (cf mon message juste au dessus disant 1000*0.1 != 1.000
Informations concernant les nombres flottants
Un nombre flottant est stocké de telle manière que la 'virgule flotte' autour de la partie réelle. De la sorte, il est possible d'avoir des nombres dont la valeur peut être aussi bien grande que petite. Toutefois vous ne pouvez pas stocker de grands nombres avec une précision aussi élevée que des petits nombres.
Une autre limitation concernant les nombres flottants est qu'ils restent concrètement représentés sous une forme binaire. Ainsi, ils ne peuvent être restitués qu'à partir de multiples et de divisions en base 2. Celà est important pour comprendre que la représentation décimale lors de l'affichage ou du calcul n'est pas tout à fait identique à ce que l'on peut attendre dans une représentation humaine. Représenter 0.5 ou 0.125 est simple car ce sont des divisions parfaites de 2, cela est plus complexe pour des nombres comme 0.11 ou 0.10999999. L'affichage approché de la valeur est toujours correct à un nombre limité de décimales, mais ne soyez pas surpris si au-delà le nombre affiché s'écarte de la valeur que vous attendez!
Ces remarques s'appliquent aux nombres flottants traités par ordinateur d'une manière générale et non spécifiquement à Purebasic.
Comme leur nom l'indique, les 'doubles' sont des flottants 'double-precision' (64 bits) comparativement aux flottants 'simple-precision' que sont les floats (32 bits). Donc, pour avoir plus de précision dans la manipulation des nombres à virgule, il est préférable d'utiliser les 'doubles'.
Publié : mer. 21/mars/2007 18:44
par Flype
ce n'est définitivement pas bizarre.
c'est un vrai-faux problème récurrent en informatique.
les calculs sur des flottants sont arrondis selon des règles normées qui aboutissent à ce genre de résultats, c'est comme çà quelque soit le langage.
c'est ce qu'explique minirop avec la norme IEEE 754
Publié : mer. 21/mars/2007 19:34
par ThoT
D'accord, merci pour ces explication claires.
J'aurai au moins appris quelque chose aujourd'hui!!
Je vais me relancer dans mon prgramme!!
++