c est quoi la solution (en java) ?

c est quoi la solution (en java) ? - Java - Programmation

Marsh Posté le 23-11-2004 à 12:46:42    

bonjour,
 
voila, y a pas tres longtemps que je programme sur java, et la je rencontre un probleme voila :
 
public class test
{
static public void main(String arg[])
{
int i;
double d=0;
for(i=0;i<10;i++) d+=1.2;
System.out.println(d);
}
}
 
apres execussion le resultat affiché est : 11.999999999999998
normalement il devrai donner 12 comme somme.
 
pourriez-vous me resoudre ce probleme ?
 
je vous remrcie d'avance.


Message édité par man4surfs le 23-11-2004 à 13:03:51
Reply

Marsh Posté le 23-11-2004 à 12:46:42   

Reply

Marsh Posté le 23-11-2004 à 12:55:05    

C'est quoi un 'probleme voial' ??
 
tu affiches un double, normal que tu ais des chiffres après la virgule..

Reply

Marsh Posté le 23-11-2004 à 12:55:45    

C'est classique. Je t'invite à lire ceci:
  http://citeseer.nj.nec.com/goldberg91what.html
 
Tu cliques sur "PDF" en haut à droite de la page.

Reply

Marsh Posté le 23-11-2004 à 12:56:33    

GaSPaRD77 a écrit :

C'est quoi un 'probleme voial' ??
 
tu affiches un double, normal que tu ais des chiffres après la virgule..


Ah bon ? 10*1,2 ça fait 11,9999999 chez toi ?  
C'est ton épicier qui doit être content.

Reply

Marsh Posté le 23-11-2004 à 12:59:18    

merci Lam's, je vais lire ce que tu m'as passé.

Reply

Marsh Posté le 23-11-2004 à 13:03:07    

Lam's a écrit :

C'est classique. Je t'invite à lire ceci:
  http://citeseer.nj.nec.com/goldberg91what.html
 
Tu cliques sur "PDF" en haut à droite de la page.


merci, mais c est en englais, et moi et l anglais ca font deux.
 
peux tu me donner une solution.
 
je crois qu il y a une solution parce que en C, y a pas ce genre de probleme. en C, il affiche directement 12.

Reply

Marsh Posté le 23-11-2004 à 13:08:24    

man4surfs a écrit :

merci, mais c est en englais, et moi et l anglais ca font deux.


t'es fâché avec le français aussi visiblement [:tartalap]


---------------
Whichever format the fan may want to listen is fine with us – vinyl, wax cylinders, shellac, 8-track, iPod, cloud storage, cranial implants – just as long as it’s loud and rockin' (Billy Gibbons, ZZ Top)
Reply

Marsh Posté le 23-11-2004 à 13:10:09    

drasche a écrit :

t'es fâché avec le français aussi visiblement [:tartalap]


pkoi ? pour 'englais' ?  
faute de frappe.

Reply

Marsh Posté le 23-11-2004 à 13:12:03    

Parce que tu faisons vraiment de vilaines fautes...

Reply

Marsh Posté le 23-11-2004 à 13:13:37    

man4surfs a écrit :

merci, mais c est en englais, et moi et l anglais ca font deux.
 
peux tu me donner une solution.
 
je crois qu il y a une solution parce que en C, y a pas ce genre de probleme. en C, il affiche directement 12.


Nan, en C aussi ça fait 11,999999, à cause de la représentation interne des flottants. Mais effectivement, par défaut, il arrondit à 12.
 
Pour le reste, tu te demerdes. J'ai pas beaucoup de patience pour les gens qui refusent d'apprendre l'anglais et qui font de l'info. :(

Reply

Marsh Posté le 23-11-2004 à 13:13:37   

Reply

Marsh Posté le 23-11-2004 à 13:13:46    

manatane a écrit :

Parce que tu faisons vraiment de vilaines fautes...


ok, j ecris rapidement et sans trop reflechir sur l ortho.
 
enfin, c est pas le but de mon sujet.
 
avez-vous une solution ?

Reply

Marsh Posté le 23-11-2004 à 13:14:42    

Lam's a écrit :

Nan, en C aussi ça fait 11,999999, à cause de la représentation interne des flottants. Mais effectivement, par défaut, il arrondit à 12.
 
Pour le reste, tu te demerdes. J'ai pas beaucoup de patience pour les gens qui refusent d'apprendre l'anglais et qui font de l'info. :(


merci qd meme.

Reply

Marsh Posté le 23-11-2004 à 13:19:32    

man4surfs a écrit :

ok, j ecris rapidement et sans trop reflechir sur l ortho.
 
enfin, c est pas le but de mon sujet.
 
avez-vous une solution ?


Lire le papier de goldberg que t'as donné Lam's (ici en HTML), c'est la base de la compréhension des nombres à virgule flottante en informatique [:spamafote]
à ma connaissance il n'y a pas de traduction en VF (ce qui est compréhensible: ni les mathématiques ni l'informatique n'ont le français comme langue standard de communication [:cupra] )


Message édité par masklinn le 23-11-2004 à 13:21:04

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 24-11-2004 à 16:14:47    

masklinn a écrit :

Lire le papier de goldberg que t'as donné Lam's (ici en HTML), c'est la base de la compréhension des nombres à virgule flottante en informatique [:spamafote]


salut,
 
merci.
 
lorsque je lirai ce papier, qu est ce que je fairais? je devrai reprogrammer l'addition ?
 
je cherche une solution, peut etre une fonction standard existe.
 
comment on fait alors pour arriver une somme excate ?

Reply

Marsh Posté le 24-11-2004 à 17:41:13    

Tu devrais commencer par soigner l'orthographe quand tu postes.
 
Quand tu auras lu le papier, tu pourras revenir poser d'autres questions.
 
EDIT : il est même possible d'éditer un message pour corriger des fautes, c'est magique ! :sol:


Message édité par sircam le 24-11-2004 à 17:42:08

---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
Reply

Marsh Posté le 24-11-2004 à 19:42:16    

Roob a écrit :

Essaye de rechercher sur le net des infos sur le type double.


Pas la peine de chercher, on lui donne le lien sur un plateau.  
 
Surtout que s'il google "IEEE 754" (qui est le standard définissant le type double tel qu'utilisé par C et Java), c'est ce document qui est donné en lien.


Message édité par Lam's le 24-11-2004 à 19:42:37
Reply

Marsh Posté le 25-11-2004 à 14:44:50    

Roob a écrit :

vraiment desagreables les developpeurs ...
ca se trouve il est pas francais d origine et puis bon quand bien meme.


merci pour toi,
 
c vrai je suis pas d origine francaise. la langue francaise est ma troixieme langue. donc, tu vois la distance ?!!
 
en tt cas, ca me gene pas la mentalité francophone.
 
bonne entente.
 

Reply

Marsh Posté le 25-11-2004 à 18:52:20    

une fois que tu aura compris tu pourra par exemple faire ca :  

Code :
  1. public static void main(String[] args) {
  2.        
  3.         int i;
  4.         double d=0;
  5.         for(i=0;i<10;i++) {
  6.             d = d + 1.2;
  7.         }
  8.         System.out.println(Math.round(d));       
  9.     }

Reply

Marsh Posté le 25-11-2004 à 19:59:31    

man4surfs a écrit :


pourriez-vous me resoudre ce probleme ?


pour faire vite : tu travaille avec des flottant. un ordinateur travaille en binaire. la représentation finie (ou exacte si tu préfères) d'un flotant en décimale est généralement inatégniable en binaire. => 1.2 ne peut pas être sauvegarder de façon exacte en binaire => il y a approximation.
 
conclusion :  
 - soit tu veux des chiffres exactes et tu travailles avec des java.math.BigDecimal, ce qui te garantit une représentation exacte des décimale.
 - soit tu te contentes d'une approximation et tu affiches tes décimaux avec 2 ou 3 chiffres après la virgule (voir java.text.DecimalFormat) ce qui te donneras visuellement les bons résultats (à moins que tu fasses des calcules très compliqués ou avec des très gros nombres).

Reply

Marsh Posté le 29-11-2004 à 14:28:10    

Bonjour,
comme les autres l'ont explique avant, ton probleme vient de la capacite forcement limitee de la machine. Ce qui s'ecrit de maniere finie en decimale peut necessiter une infinite de bits en binaire.
C'est un probleme bien connu des numericiens qui ont donc une solution a ca: ne jamais tester l'egalite de 2 nombres :) L'astuce consiste a se fixer un seuil pour les comparaisons.  
Au lieu d'ecrire  
 

Code :
  1. if (a == b) {
  2.   ...
  3. }


tu dois plutot ecrire  
 

Code :
  1. if (Math.abs(a-b) < seuil) {
  2.     ...
  3.    }


 
C'est un peu plus lourd mais tu n'as pas vraiment le choix. Dans des programmes, j'ai vu un seuil de 1.0e-7 pour le calcul sur les doubles. Y'a surement une raison pour cette valeur mais je ne la connais pas.  
 
l00z

Reply

Marsh Posté le 29-11-2004 à 15:38:22    

l00z a écrit :

Y'a surement une raison pour cette valeur mais je ne la connais pas.


L'informatique c'est une science, pas une série de recettes de grand-mères.  
 
Si tu veux savoir quelles valeur d'epsilon utiliser, c'est expliqué dans le document de Goldberg (bah oui, il y a une raison pour laquelle on est lourds comme ça).

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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