Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1389 connectés 

  FORUM HardWare.fr
  Programmation
  Java

  c est quoi la solution (en java) ?

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

c est quoi la solution (en java) ?

n°905411
man4surfs
Posté le 23-11-2004 à 12:46:42  profilanswer
 

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
mood
Publicité
Posté le 23-11-2004 à 12:46:42  profilanswer
 

n°905419
GaSPaRD77
Posté le 23-11-2004 à 12:55:05  profilanswer
 

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

n°905420
Lam's
Profil: bas.
Posté le 23-11-2004 à 12:55:45  profilanswer
 

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.

n°905422
Lam's
Profil: bas.
Posté le 23-11-2004 à 12:56:33  profilanswer
 

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.

n°905427
man4surfs
Posté le 23-11-2004 à 12:59:18  profilanswer
 

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

n°905432
man4surfs
Posté le 23-11-2004 à 13:03:07  profilanswer
 

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.

n°905438
drasche
Posté le 23-11-2004 à 13:08:24  profilanswer
 

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)
n°905440
man4surfs
Posté le 23-11-2004 à 13:10:09  profilanswer
 

drasche a écrit :

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


pkoi ? pour 'englais' ?  
faute de frappe.

n°905443
manatane
En vous remerciant, bonsoir
Posté le 23-11-2004 à 13:12:03  profilanswer
 

Parce que tu faisons vraiment de vilaines fautes...

n°905446
Lam's
Profil: bas.
Posté le 23-11-2004 à 13:13:37  profilanswer
 

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. :(

mood
Publicité
Posté le 23-11-2004 à 13:13:37  profilanswer
 

n°905448
man4surfs
Posté le 23-11-2004 à 13:13:46  profilanswer
 

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 ?

n°905450
man4surfs
Posté le 23-11-2004 à 13:14:42  profilanswer
 

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.

n°905456
masklinn
í dag viðrar vel til loftárása
Posté le 23-11-2004 à 13:19:32  profilanswer
 

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
n°906744
man4surfs
Posté le 24-11-2004 à 16:14:47  profilanswer
 

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 ?

n°906868
sircam
I Like Trains
Posté le 24-11-2004 à 17:41:13  profilanswer
 

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}
n°906966
Lam's
Profil: bas.
Posté le 24-11-2004 à 19:42:16  profilanswer
 

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
n°907711
man4surfs
Posté le 25-11-2004 à 14:44:50  profilanswer
 

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.
 

n°907915
zerod
atchoum !
Posté le 25-11-2004 à 18:52:20  profilanswer
 

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.     }

n°907959
benou
Posté le 25-11-2004 à 19:59:31  profilanswer
 

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).

n°910304
l00z
Posté le 29-11-2004 à 14:28:10  profilanswer
 

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

n°910357
Lam's
Profil: bas.
Posté le 29-11-2004 à 15:38:22  profilanswer
 

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).

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Java

  c est quoi la solution (en java) ?

 

Sujets relatifs
[Java]Importer un jar dans un autre...[JAVA Socket] ou comment detecter qd un client s'est deconnecté?
[JAVA] (débutant) Copier un tableau à deux dimensions[MySQL/JAVA]pb avec driver ODBC
java, truetype et anti-aliasing[java] un random avec une valeur int
[java] comment faire en sorte que un Jtextarea[java] telecharger n'importe qu'elle fichier
[Java] solution EJB fonctionnant comme un trigger[JAVA] Récupérer width & height d'une image [Solution inside]
Plus de sujets relatifs à : c est quoi la solution (en java) ?


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR