Problemes de virgules et d'arrondis...

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
ThoT
Messages : 33
Inscription : mar. 20/mars/2007 17:51

Problemes de virgules et d'arrondis...

Message 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! :D
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Problemes de virgules et d'arrondis...

Message par Backup »

ThoT a écrit :leur utilisation dans une boucle "for next"
ça fait longtemps que je demande ça !! (Dr Dri aussi :D)
et on attends toujours ! :?

bien sur, bien sur, on peut utiliser While-Wend, mais c'est pas pareil
pas aussi conviviale :D
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Message 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
minirop
Messages : 321
Inscription : mer. 02/août/2006 21:06

Message 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
ThoT
Messages : 33
Inscription : mar. 20/mars/2007 17:51

Message 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 :
Image

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 :
Image


Bizzare, non??
minirop
Messages : 321
Inscription : mer. 02/août/2006 21:06

Message 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'.
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Message 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
ThoT
Messages : 33
Inscription : mar. 20/mars/2007 17:51

Message par ThoT »

D'accord, merci pour ces explication claires.
J'aurai au moins appris quelque chose aujourd'hui!! :lol:
Je vais me relancer dans mon prgramme!!
++
Répondre