Stupides double ...

Stupides double ... - C++ - Programmation

Marsh Posté le 17-08-2004 à 15:56:21    

A croire que je viens d'apprendre à programmer il y a 2 mois ... Je n'avais jamais remarqué cela avant, PE parceque je fais enfin un travail serieux ...
 
Un probleme STU-PIDE, mais chiant, mais chiant ... J'ai le meme en C, et en java.
 
En somme :  double i=1; double j=-2; j+=i;   !!!!-> j=-1.00000000000000001
C'est tout nul comme ca, tout le monde s'en fout de cette (petite) erreur.
Mais 1) c'est trop chiant que tu l'affiches.
2) quand tu repetes l'operation des millions de fois, avec des calculs pas beaux, ça devient TRES lourd cette "plus du tout petite" erreur.
3) quand tu teste si c'est ==0, bin forcement, non, puisque c'est 0.00000001
 
 Voila. Ya une solution docteur ? Apprendre à mon CPU à compter avec des decimaux ?
 
2ieme pb : le random, le gros random basique livré de base sans includes, c'est rand(). Genial, ce *** de rand est entre 0 et 32XXX minimum, cf la doc En locurence, ils ont choisi 32XXX. Donc si j'ai plus de 32XXX "choses" différentes à init, je vais me faire voir ?
 
 
En gros, c'etait pour pousser un cri.
 
Wiiip - l'herbe est plus verte ailleurs ... Ailleurs ... Mignone, allons voir si Fortan ....

Reply

Marsh Posté le 17-08-2004 à 15:56:21   

Reply

Marsh Posté le 17-08-2004 à 16:00:08    

la seule personne stupide ici c'est toi ...

Reply

Marsh Posté le 17-08-2004 à 16:02:20    

utilise des float :D


---------------
Nos estans firs di nosse pitite patreye...
Reply

Marsh Posté le 17-08-2004 à 18:39:54    

c'est pas du C ni du C++ ni du java, c'est IEEE 764
 
http://www.google.com/search?hl=en [...] tnG=Search
 
1) on peut toujours arrondir  
2) bof, même ajouté des millions de fois, ça reste assez petit et puis si tu as besoin de calculs très précis, tu peux toujours implémenter ta propre représentation des nombres à virgule flottante, mais à part pour des super calculs scientifiques, ça sert pas à grand chose
3) mhgr

Reply

Marsh Posté le 17-08-2004 à 18:43:16    

google "floating point goldberg.pdf" J'ai de la chance

Reply

Marsh Posté le 17-08-2004 à 18:51:15    

hé moi je capte pas si je fais
#include <iostream.h>
int main(){
 
double i=1;  
double j=-2;  
j+=i;
cout<<"j="<<j;
 
}
ca affiche J=-1
donc g pas d erreur,comment on fait pour avoir l erreur alors?
 
ps: dire a quelqu'un qu il est stupide car il fait est une erreur est réelement stupide, et antipédagogique  :o


Message édité par lunarnet76 le 17-08-2004 à 18:52:57
Reply

Marsh Posté le 17-08-2004 à 19:00:28    

comment faire ? ben tu lis le pdf
 
et je ne parle pas du C++ :o

Reply

Marsh Posté le 17-08-2004 à 19:05:51    

ah ok lol pas mal...
bon je vais pas essayer c compliké tous c pdf...

Reply

Marsh Posté le 17-08-2004 à 19:17:49    

Merci lunarnet ^^
Le calcul n'est pas aussi simple, bisarement, c'est quand tu utilise vraiment la chose que ça t'embette ^^.
 
Un petit exemple : (attention, c'est pas beau, mais c'est court au moins)
 
#include <iostream>
#include <stdlib.h>
 
using namespace std;
 
int main(int argc, char *argv[])
{
  double i,j;
  i=-1.23;
  j=0;
  while(i)
  {i-=(int)i;
  i*=10;
  j++;
  }
  cout<<j<<endl;
   
   
  system("PAUSE" );  
  return 0;
}
 
(je repete : fait en foutant sur la première page Dev-C++ venue)
Dont si tu trouve comme moi de 1.23 contient 52 chiffres, tu gagne. (ça fait office de generateur aléatoire d'ailleur ^^)
 
 
Justement, pour repondre à Raytaller, tu peux constater qu'entre 3 et 52, il y a un ecart non négligeable, ok, ce programme sert à rien, mais imagine que, même s'il ne t'en viens pas en tête, on peut trouver des projets pour lequelles ce genre d'erreurs deviennent .. pensantes ...
 
Ma propre representation ? Oui je sais, je l'ai déjà fais 2 fois, mais je ne peux pas le faire pour les programme des autres participants au projet ^^.
 
T'façon, le message n'est pas là, je constate simplement que d'autres personnes sont au courrant, je tombe simplement des nues en découvrant qu'un ordinateur, ça sait pas compter !
 
Je vais faire un petit sondage à ce propos ... Combien de personnes iraient penser cela ... Pas le directeur informatique de votre entreprise en tout cas ^^.

Reply

Marsh Posté le 17-08-2004 à 19:27:16    

je viens de faire une attaque ...

Reply

Marsh Posté le 17-08-2004 à 19:27:16   

Reply

Marsh Posté le 17-08-2004 à 19:30:15    

ckoistopic?

Reply

Marsh Posté le 17-08-2004 à 19:56:46    

euh, tu peux m expliquer a quoi sert le programme, que je comprenne en quoi l erreur est importante?
ps: ca fait quoi ca while(i){} je vois pas du tout ...


Message édité par lunarnet76 le 17-08-2004 à 19:57:47
Reply

Marsh Posté le 17-08-2004 à 19:58:33    

le programme il fait n'importe quoi ...

Reply

Marsh Posté le 17-08-2004 à 20:01:29    

ah ok lol
mais sinon while(i) c'est une boucle infini non?

Reply

Marsh Posté le 17-08-2004 à 20:14:46    

pffff, vous etes lourds ...
Quand il compile il fait pas la différence vous savez .. Bande de gnagnagna du code joli ...
"while(i!=0)"
heureux ?
Nan, c'est pas une boucle infinie, et j'avoue que la partie entiere à coup de (int)i, ce n'est pas joli non plus.
 
A la reflexion, le 52 est tout à fait logique ... Cela reste bougrement stressant de se dire que la representation des decimaux est si corruptible ...
Comme quoi ... Il faudrait nous apprendre à compter en hexadecimal dans les petites classes, au moins nous tomberions d'accord avec nos ordinateurs ...
 
Rectification : les ordinateurs savent compter, mais pas en decimal ^^
 
Wiiip - qui apprend de grandes choses aujourd'hui  
-> Merci à Taz et à Raytaller ! (on se fait engueuler, mais on en sort plus sage ^^)

Reply

Marsh Posté le 17-08-2004 à 20:19:00    

ce que ta pas compris c'est qu'on fais jamais de test d'egalité binaire entre 2 reel, test le delta

Reply

Marsh Posté le 17-08-2004 à 20:28:48    

wiiip a écrit :

pffff, vous etes lourds ...


désolé mais moi je suis débutant alors si je vois un truc comme ca je test et j essaie de comprendre, c comme ca k on apprend !!!  :D  
la preuve ca ma fait me posé une question sur while(i)!!!

Reply

Marsh Posté le 17-08-2004 à 20:31:55    

0 est faux, le reste vrai
 
while(1); boucle infinie
 
while(i) { /* affect i */ }  boucle jusqu'a ce que i == 0

Reply

Marsh Posté le 17-08-2004 à 20:37:21    

merci cris56, mais bon je suis ok que je devrais arreter d etre flemmard et me promené avant de posé d questions comme celle la!!!
merci encore a tous ceux qui sont obligés de supportés les flemmars comme moi :D


Message édité par lunarnet76 le 17-08-2004 à 20:37:55
Reply

Marsh Posté le 17-08-2004 à 20:43:04    

lis le PDF de Taz bordaiiillll.
 
par contre je suis étonné, 1 et 2 sont exprimables en virugle flottante..... (sans probs)


Message édité par bjone le 17-08-2004 à 20:43:46
Reply

Marsh Posté le 17-08-2004 à 20:49:18    

pourquoi étonné ? ça te paraît pas être des puissances de deux ?

Reply

Marsh Posté le 17-08-2004 à 21:40:53    

bin si donc justement ça devrait pas poser de probs à l'addition et à l'affichage... enfin je me comprends (je sais pas si tu as compris ce que je voulais dire...)

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed