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

 


 Mot :   Pseudo :  
 
 Page :   1  2  3  4
Auteur Sujet :

[java] Pb de multiplication de double ?????

n°481200
benou
Posté le 08-08-2003 à 15:58:13  profilanswer
 

Reprise du message précédent :

greg@freestarthu a écrit :

mes cours de ? à la ...????


t'as capté ou non ?


---------------
ma vie, mon oeuvre - HomePlayer
mood
Publicité
Posté le 08-08-2003 à 15:58:13  profilanswer
 

n°481206
greg@frees​tarthu
Posté le 08-08-2003 à 15:58:51  profilanswer
 

benou a écrit :


t'as capté ou non ?

euh, jsuis supposé lire l'article ieee là? :/


---------------
\^o^/ Libérez HotShot \^o^/
n°481210
liengy
Approuved !!!
Posté le 08-08-2003 à 15:59:43  profilanswer
 

benou a écrit :


edit :
 
liengy > conclusion :
tu choisis une précision (ex : 10^-10). tu créés un DecimalFormat correspondant : df = new DecimalFormat("0.##########" ); (le nombre de '#' est la précision en nombre de chiffres après la virgule), et tu passes par cet objet Format pour afficher tes résultats, et tu auras le résultat attendu.


 
Bon bien merci à tous... Mais ma ccl est qq peu différente...
En fait je vais changer les types de données, ainsi je vais travailler avec des java.lang.Float... Ayant besoin d'une précision à 4 chiffres, ça me suffit...
En revanche ça me fait bcp de modif' étant donné que tout cela est le ruit de plein de f°.... :/
 
 
Encore merci à tous :jap:

n°481221
benou
Posté le 08-08-2003 à 16:03:03  profilanswer
 

liengy a écrit :


Encore merci à tous :jap:


mais nan t'as rien capté !!!!!!
 
que ce soit des float ou des doubles c'est pareil !!!!  c'est juste l'affichage des float qui est différent !
 
garde tes doubles, et utilise un DecimalFormat(0.####) pour transformer le décimal en chaine à la place de directement l'écrire sur la sortie standard, et tu auras le comportement que tu veux !


---------------
ma vie, mon oeuvre - HomePlayer
n°481254
benou
Posté le 08-08-2003 à 16:15:31  profilanswer
 

greg@freestarthu a écrit :

euh, jsuis supposé lire l'article ieee là? :/


bha il est pas très grand.
 
bon, ce qu'il faut capter c'est que un décimal, contrairement à un entier, ca peut prendre un nombre de valeur infinie sur une plage de valeur donnée.
 
=> pour les integer pas de problème : on a droit au un certain nombre de bit (ex : 16) qui permettent de coder un certain nombre de valeur (2^16 => avec 16 bits tu peut représenter toute sles valeurs entre -2^15 et 2^15)
 
pour les flottant c'est plus dur : on ne peut pas définir une plage de valeur dans laquelle on pourra représenter toutes les valeurs décimale ... Donc comment faire ??? on a droit à x bits (ex : 16) et on doit représenter une infinité de valeur avec ca ... y a pas le choix : la seule chose à faire est de "choisir" quelques valeurs (2^16 valeurs) dans une plage de valeurs et laisser des trous entre => imprecision.
 
comme on est en binaire, les valeurs "choisies" ne sont pas des valeurs exactes en base 10 => c'est pour ca qu'on tombre assez facilement sur ce genre de cas...
 
en fait le codage choisi pour les flottant (décrit dans le lien ieee) fait que plus les valeurs sont petites (proches de 0), plus la précision est grande.
 
compris ?


---------------
ma vie, mon oeuvre - HomePlayer
n°481260
greg@frees​tarthu
Posté le 08-08-2003 à 16:17:55  profilanswer
 

ouais, merci :)
 
c nul [:spamafote]


---------------
\^o^/ Libérez HotShot \^o^/
n°481263
benou
Posté le 08-08-2003 à 16:19:41  profilanswer
 


bha y a rien de magique en info ... comment tu veux stocker un truc qui peut prendre une infinité de valeur  :??:


---------------
ma vie, mon oeuvre - HomePlayer
n°481265
greg@frees​tarthu
Posté le 08-08-2003 à 16:21:01  profilanswer
 

benou a écrit :


bha y a rien de magique en info ... comment tu veux stocker un truc qui peut prendre une infinité de valeur  :??:  

ben j'en sais rien, j'ai pas une solution comme ça, mais je trouve ça un peu gros pour un nombre aussi peu précis que 1.15 ou 93 quoi ...


---------------
\^o^/ Libérez HotShot \^o^/
n°481278
benou
Posté le 08-08-2003 à 16:31:33  profilanswer
 

greg@freestarthu a écrit :

ben j'en sais rien, j'ai pas une solution comme ça, mais je trouve ça un peu gros pour un nombre aussi peu précis que 1.15 ou 93 quoi ...  


ben je te l'ai dit, c'est parce que c'est de la base 2 ... y a pas bcp de chance que tu tombe sur un décimal de base 10 :/


---------------
ma vie, mon oeuvre - HomePlayer
n°481280
benou
Posté le 08-08-2003 à 16:32:19  profilanswer
 

greg@freestarthu a écrit :

ben j'en sais rien, j'ai pas une solution comme ça


normal, y en a pas :o


---------------
ma vie, mon oeuvre - HomePlayer
mood
Publicité
Posté le 08-08-2003 à 16:32:19  profilanswer
 

n°481282
greg@frees​tarthu
Posté le 08-08-2003 à 16:33:02  profilanswer
 

benou a écrit :


normal, y en a pas :o

bah ptet un truc du genre utiliser une partie des bits pour définir la précision, qqchose comme ça :??:


---------------
\^o^/ Libérez HotShot \^o^/
n°481286
benou
Posté le 08-08-2003 à 16:36:02  profilanswer
 

greg@freestarthu a écrit :

bah ptet un truc du genre utiliser une partie des bits pour définir la précision, qqchose comme ça :??:


la solution dont tu parles ce serait pas plutot d'utiliser 2 entiers ? (un pour la partie entière et l'autre pour la décimale).
 
ca marche, mais c'est moins efficace ... enfin, ca dépend des besoins que tu as mais globalement c'est moins efficace ...


---------------
ma vie, mon oeuvre - HomePlayer
n°481293
greg@frees​tarthu
Posté le 08-08-2003 à 16:39:11  profilanswer
 

benou a écrit :


la solution dont tu parles ce serait pas plutot d'utiliser 2 entiers ? (un pour la partie entière et l'autre pour la décimale).
 
ca marche, mais c'est moins efficace ... enfin, ca dépend des besoins que tu as mais globalement c'est moins efficace ...

ouais un truc dans le genre
 
bah je trouve ça abérant les resultats qu'on a sur une multiplication aussi simple quoi
m'enfin bon


---------------
\^o^/ Libérez HotShot \^o^/
n°481295
darklord
You're welcome
Posté le 08-08-2003 à 16:40:05  profilanswer
 

on peut pas tout avoir [:spamafote]

n°481303
benou
Posté le 08-08-2003 à 16:42:46  profilanswer
 

greg@freestarthu a écrit :


bah je trouve ça abérant les resultats qu'on a sur une multiplication aussi simple quoi
m'enfin bon


mais je vois pas pourquoi : tu t'en fous si tu a pas besoin d'une grande précision : t'as juste à arrondir à la précision que tu as choisi et ca roule ! ca revient exactement au même !


---------------
ma vie, mon oeuvre - HomePlayer
n°481309
darklord
You're welcome
Posté le 08-08-2003 à 16:43:54  profilanswer
 

benou a écrit :


mais je vois pas pourquoi : tu t'en fous si tu a pas besoin d'une grande précision : t'as juste à arrondir à la précision que tu as choisi et ca roule ! ca revient exactement au même !


 
j'ai l'impression que ce que greg voudrait c'est obtenir le chiffre tout rond qui va bien sans devoir passer par des formats machin bidules. Mais bon c'est clair qu'une telle solution ne prend pas tout les cas en compte

n°481311
greg@frees​tarthu
Posté le 08-08-2003 à 16:44:57  profilanswer
 

ben sauf que je peux pas necessairement deviner à l'avance ... enfin la moindre des choses serait d'avoir un resultat le plus correct possible...


---------------
\^o^/ Libérez HotShot \^o^/
n°481315
greg@frees​tarthu
Posté le 08-08-2003 à 16:45:44  profilanswer
 

DarkLord a écrit :


 
j'ai l'impression que ce que greg voudrait c'est obtenir le chiffre tout rond qui va bien sans devoir passer par des formats machin bidules. Mais bon c'est clair qu'une telle solution ne prend pas tout les cas en compte

ben oui
si je multipliais 34,2073072 par 3,2975830 je m'attendrais pas à avoir la réponse précise a 48 décimales...
par contre sur un nombre à 2 décimales :/


Message édité par greg@freestarthu le 08-08-2003 à 16:46:05

---------------
\^o^/ Libérez HotShot \^o^/
n°481317
benou
Posté le 08-08-2003 à 16:46:18  profilanswer
 

DarkLord a écrit :


 
j'ai l'impression que ce que greg voudrait c'est obtenir le chiffre tout rond qui va bien sans devoir passer par des formats machin bidules. Mais bon c'est clair qu'une telle solution ne prend pas tout les cas en compte

je vois vraiment pas le problème ...
 
qu'est ce que vous croyais qu'il fait le System.our.println() ??


---------------
ma vie, mon oeuvre - HomePlayer
n°481322
benou
Posté le 08-08-2003 à 16:48:09  profilanswer
 

greg@freestarthu a écrit :

par contre sur un nombre à 2 décimales :/


ouais mais les 2 décimale c'est en en base 10  
 
mais les ordinateurs récents marchent en base 2 [:spamafote]
 
prend le codage donné dans la doc IEEE machin, tu verras que 106.95 ca tombe pas juste en base 2 [:spamafote]


Message édité par benou le 08-08-2003 à 16:49:19

---------------
ma vie, mon oeuvre - HomePlayer
n°481330
darklord
You're welcome
Posté le 08-08-2003 à 16:51:32  profilanswer
 

benou a écrit :

je vois vraiment pas le problème ...
 
qu'est ce que vous croyais qu'il fait le System.our.println() ??


 
euh je suis d'accord avec toi au cas où tu n'aurais pas compris. J'essaie juste de me mettre du point de vue de greg ...

n°481331
greg@frees​tarthu
Posté le 08-08-2003 à 16:52:05  profilanswer
 

vais leur apprendre à compter moi à ces incapables [:toad666]


---------------
\^o^/ Libérez HotShot \^o^/
n°481333
benou
Posté le 08-08-2003 à 16:53:56  profilanswer
 

DarkLord a écrit :


J'essaie juste de me mettre du point de vue de greg ...


pas évident ca :/
 
là va maintenant falloir que tu te mettes à insulter le mec qui a découvert l'arithmétique en base 2 :D


---------------
ma vie, mon oeuvre - HomePlayer
n°481356
Kristoph
Posté le 08-08-2003 à 17:13:09  profilanswer
 

Mais le résultat donné par Java est très précis ! Faut pas se faire avoir par la barrière psychologique des 9. Rappel : 999.99? n'est *pas* beaucoup moins cher que 1000?. Dans ton cas abs(106.95 - 106.94999999) = 10^-8 ce qui est effectivement un résultat très précis.
 
Solution : comme tes calculs ont une imprécision à 10 chiffres, tu arrondis à 9 chiffres au moment de l'affichage.

n°481889
fykman
Errare Humanum Est
Posté le 09-08-2003 à 01:50:21  profilanswer
 

liengy a écrit :

Voilà j'ai un pb, je dois multipier 2 nb que je récupère dans une base de données....
 
C deux nb sont des doubles.
 
Dans mon ex. je récupère 1.15, et 93.0
Et lorsque je les multiplie (avec l'opérateur * en java), j'obtiens : 106.94999999
au lieu de 106.95 !!!!!!
 
 
 
Est-ce que quelqu'un a une solution , car je comprends meme pas d'ou ça vient ? Sachant que je récupère bien les bons nombres à multiplier comme indiqué....
 
 
 
Merci


 
Je vois pas ce qui te genes, si tu avais eu 106.9500000001 ca t'aurais moins choqué ?
Que tu travailles en flottant ou en double, tu fait des calculs  a une precision pres, pour laquelle tu ne peut pas t'affranchir. C'est comme ca...
 
Ce qu'il faut que tu comprennes c'est que toutes les machines a calculer du monde marchent comme ca, la difference c'est que le resultat est arrondi a un certain nombre de chiffres apres la virgule, ce qui te donne 106.95000000 et donc 106.95
 
 

n°481897
deltaden
Posté le 09-08-2003 à 03:29:00  profilanswer
 
n°481930
Taz
bisounours-codeur
Posté le 09-08-2003 à 10:16:49  profilanswer
 

mais qu'est ce que sait que ce topic? les double ne sont pas des nombres réels... et sans parler de précision, certains nombres à l'écriture finie en base 10, n'ont pas une écriture finie en base2 (et réciproquement)

n°481931
benou
Posté le 09-08-2003 à 10:20:09  profilanswer
 

bon ... vous arrêtez de tous répéter ce que j'ai déjà dit !  :o  
 
;)


---------------
ma vie, mon oeuvre - HomePlayer
n°481989
greg@frees​tarthu
Posté le 09-08-2003 à 13:08:42  profilanswer
 

Taz a écrit :

mais qu'est ce que sait que ce topic?  

ne prend pas le monde de haut comme ça s'il te plait :o

n°483299
R3g
fonctionnaire certifié ITIL
Posté le 11-08-2003 à 12:29:29  profilanswer
 

Taz a écrit :

mais qu'est ce que sait que ce topic?


c'est [:aloy]


Message édité par R3g le 11-08-2003 à 12:30:07
n°483360
Taz
bisounours-codeur
Posté le 11-08-2003 à 13:47:48  profilanswer
 

j'ai des relans de meskien incontrolés

n°483469
ffluff
Challenge Everything
Posté le 11-08-2003 à 14:35:58  profilanswer
 

Je comprends tres bien le point de vue de Greg .
Imaginez le physiciens,chimiste ou autre qui travaile avec beaucoup de decimal et donc ne doivent pas utiliser d'aproximation.
 
Si ils ne peuvent meme plus faire confiance à un ordinateur pour faire une simple multiplication.
 
Imaginez :
a = 1.15000000000000 apres mesure d'un truc
b = 93.00000000000000 apres autre mesure.
 
et  ils font un truc du style :
si a*b == 106.94999999 alors  
 faire un truc  
sinon
 faire autre chose
 
Ils ne feront pas la bonne operation puisque 1.15*93!=106.94999999 alors que d'apres l'ordinateur  
1.15*93==106.94999999
 
:/
 
Mais bon si ca a marché comme ca jusqu'à maintenant ...

n°483505
Kristoph
Posté le 11-08-2003 à 14:48:43  profilanswer
 

fFluFf a écrit :

Je comprends tres bien le point de vue de Greg .
Imaginez le physiciens,chimiste ou autre qui travaile avec beaucoup de decimal et donc ne doivent pas utiliser d'aproximation.
 
Si ils ne peuvent meme plus faire confiance à un ordinateur pour faire une simple multiplication.
 
Imaginez :
a = 1.15000000000000 apres mesure d'un truc
b = 93.00000000000000 apres autre mesure.
 
et  ils font un truc du style :
si a*b == 106.94999999 alors  
 faire un truc  
sinon
 faire autre chose
 
Ils ne feront pas la bonne operation puisque 1.15*93!=106.94999999 alors que d'apres l'ordinateur  
1.15*93==106.94999999
 
:/
 
Mais bon si ca a marché comme ca jusqu'à maintenant ...


 
Mais non ! Ce genre de problème ne gène absolument pas les physiciens justement. Pourquoi ? Parceque l'on connait explicitement la précision des calculs sur les flottants. D'ailleurs, 106.94999999 est une bonne approximation de 106.95. Ensuite, tout physicien qui se respecte n'osera jamais faire de test d'égalité entre nombres réels.
Citaition réelle :
- Examinateur : (...) La tention V est inferieure à 5 Volts.
- Etudiant après 5 minutes de silence : inferieur strict ?
 
Et pour cet exemple précis, les maths nous montrent que le résultat n'est pas si faux que ça car : 106.95 = 106.94999999999... Les 2 sont des écritures possibles pour représenter le même nombre.

n°483507
Taz
bisounours-codeur
Posté le 11-08-2003 à 14:49:07  profilanswer
 

fFluFf a écrit :

Je comprends tres bien le point de vue de Greg .
Imaginez le physiciens,chimiste ou autre qui travaile avec beaucoup de decimal et donc ne doivent pas utiliser d'aproximation.
 
Si ils ne peuvent meme plus faire confiance à un ordinateur pour faire une simple multiplication.
 
Imaginez :
a = 1.15000000000000 apres mesure d'un truc
b = 93.00000000000000 apres autre mesure.
 
et  ils font un truc du style :
si a*b == 106.94999999 alors  
 faire un truc  
sinon
 faire autre chose
 
Ils ne feront pas la bonne operation puisque 1.15*93!=106.94999999 alors que d'apres l'ordinateur  
1.15*93==106.94999999
 
:/
 
Mais bon si ca a marché comme ca jusqu'à maintenant ...

refroidis ton neurone. ben ils ont des outils de calcul formel et l'appromimation ils la prennent bien. en physique, t'as besoin de 40 décimales de Pi pour calculer la taille de l'univers.... on en calculé je sais plus combien de millions.... les doubles c'est 64 bits, c'est déjà pas mal. en C, y a les long double sur 96bits (64bits de mantisses, je sais plus combien d'exposant et quelques bits qui servent à rien)
apres si t'es pas encore content, ben tu as des bibliothèques de précision infinie (mais très lente)
note que l'approximation en calcul informel à du bon, si non, tu t'en sors jamais quand tu manipules des racines et des exponentiels.

n°483536
benou
Posté le 11-08-2003 à 15:03:16  profilanswer
 

rien qu'en Java, dans l'api standard t'as java.math.BigDecimal qui permet de faire des calculs d'une précision que tu choisies


---------------
ma vie, mon oeuvre - HomePlayer
n°483552
ffluff
Challenge Everything
Posté le 11-08-2003 à 15:08:01  profilanswer
 

Taz a écrit :

refroidis ton neurone. ben ils ont des outils de calcul formel et l'appromimation ils la prennent bien. en physique, t'as besoin de 40 décimales de Pi pour calculer la taille de l'univers.... on en calculé je sais plus combien de millions.... les doubles c'est 64 bits, c'est déjà pas mal. en C, y a les long double sur 96bits (64bits de mantisses, je sais plus combien d'exposant et quelques bits qui servent à rien)
apres si t'es pas encore content, ben tu as des bibliothèques de précision infinie (mais très lente)
note que l'approximation en calcul informel à du bon, si non, tu t'en sors jamais quand tu manipules des racines et des exponentiels.


merci pour le neurone pense aussi au tiens apparement il bug ;)
 
t'as pas capte je me doute bien qu'ils(ceux qui ont besoin d'etre super precis) doivent avoir de bon outils qui marchent niquel.
mais bon un programmateur lambda (sans grande connaissant de l'impression des doubles& co)
mets un tel test dans son programme ...
 
Désolé mais 1.15*93 je ne me doutais absolument pas que ca pouvais donner un nombre à 10 chiffres apres la vigule et je pense que pas beaucoup de gens (meme ceux qui ont suivit des cours à la fac) le voient du premier coup donc pas beaucoup de gens aurais l'idée de passer en 96bits & compagnie mais bon.
 
si on ne peut plus faire confiance à un ordi pour une simple multiplication ...
Car vous n'arriverez pas à me faire croire que 106.95 = 106.9499999999
 
 
PS: c'est clair si tu pouvais évité de te prendre pour "bruce tout puissant" et dire des truc du style "vous etes des con vous ne comprennez rien" pour un modo ca le fait pas.

n°483561
Taz
bisounours-codeur
Posté le 11-08-2003 à 15:11:46  profilanswer
 

:o  
 
les BigDecimal en Java, c'est bof: c'est très lent (ce qui est normal), y a pas de surcharge d'opérateur, donc dur à manipuler, et que c'est des instances invariantes (si je me souviens bien), c'est lent aussi.
 
mais ça fonctionne, le truc compliqué, les 36 modes d'arrondis  :pt1cable:  
 
fluf > je suis "tout puissant"
 
 
et pis va falloir que tu te souviennes que 0,9999... = 1 par définition et que les ingénieurs, ils ont un deuxième neurone pour calculer les marges d'erreurs

n°483584
stolenkiss
127.0.0.1, sweet 127.0.0.1
Posté le 11-08-2003 à 15:19:03  profilanswer
 

Si je peux me permettre,
 
   0.9999... ca tend vers 1, mais ca n'est pas 1. Juste par conscience mathématique. Parce que quand je lis ca:
 
   

Citation :

0,9999... = 1 par définition


 
   Je fais des bonds sur ma chaise :D
 
Stolenkiss

n°483587
ffluff
Challenge Everything
Posté le 11-08-2003 à 15:19:51  profilanswer
 

Taz a écrit :


fluf > je suis "tout puissant"


ou pas  [:ffluff]  
 

Taz a écrit :


et pis va falloir que tu te souviennes que 0,9999... = 1 par définition et que les ingénieurs, ils ont un deuxième neurone pour calculer les marges d'erreurs


qui a parlé d'ingenieur c'etait juste un example (mal choisit peut etre)  
par definition 0.999...=1 ah bon :??:  
t'es le premier qui me dis ca. En parlant de limite et tout ok sinon non.

n°483591
Taz
bisounours-codeur
Posté le 11-08-2003 à 15:21:02  profilanswer
 

pi à la base je  :o par ce qu'il a fallu 1 page pour qu'un mec dise enfin "hey, les doubles sont une réprésentation imprécise des réels"

n°483599
Kristoph
Posté le 11-08-2003 à 15:22:20  profilanswer
 

0.999999.... est ce qu'on appelle en math une écriture dégénérée du nombre 1.

mood
Publicité
Posté le   profilanswer
 

 Page :   1  2  3  4

Aller à :
Ajouter une réponse
 

Sujets relatifs
Java + XML + Crystal Reports9 dev ----> Cherrytree, tu es là ?bouquin d'initiation à la prog nécessitant FORTE FOR JAVA.
connaitre la largeur d'une chaine en java (ou plutôt jsp)(Java) GridBagLayout et garder une colonne de largeur fixe
[Java] Ecrire un fichier MIDIJava JNI
JIT compiler pour java[JAVA XML] Une JSP bien formée
[JAVA] lancer un script depuis java[JAVA] FTP sous Eclipse, comment activer le transfert ASCII?
Plus de sujets relatifs à : [java] Pb de multiplication de double ?????


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