IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Java Discussion :

addition de Double


Sujet :

Langage Java

  1. #21
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Les architectures des machines ne sont pas les mêmes (indépendement de la norme IEEE et de la précision utilisée pour les nombres flottants), leur unités de calculs sont implémentées de manières différentes (avec des bugs différents...) et suivant les languages et les compilateurs des optimisation sont + ou - utilisées pour simplifier/accélérer le calcul (et cela peut impliquer parfois des transtypages et des cast non-explicites dans le code).

    As-tu également essayer d'inclure l'instruction strictfp dans la classe où tu fais ton calcul ?
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  2. #22
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 94
    Points : 92
    Points
    92
    Par défaut
    merci bouye,
    on ne le dis jamais assez, l'utilisation des parenthèses a du bon même quand on les croit inutiles :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
       	 double sumDouble = 8.0d + (8.33d+ 8.33d); 
        	 double sumDouble2 = 8.33d + 8.33d + 8.0d;
    donne bien un unique résultat : 24.66
    pour les architectures, oui aussi, car je ne parviens pas à obtenir le même résultat que jowo sur sumDouble ...
    et merci pour le lien, le faq sur l'ellipse m'est particulièrement util...
    A+

  3. #23
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 78
    Points : 81
    Points
    81
    Par défaut
    Je ne comprends pas très bien ta remarque, jcodeunpeu :

    Mathématiquement, ( a + b ) +c = a + ( b + c) non???

    Donc, même si du fait de la représentation machine, la place des parenthèses a une répercussion sur le résultat final, je ne vois pas quelle logique pourrait indiquer où placer lesdites parenthèses dans le cas présent...

    En tout cas, ayant initié la question, je remercie tout ceux qui ont participé à la discussion, et conclut la chose suivante:

    - tout le monde est d'accord avec le fait que le problème vient de la représentation mémoire des nombres, et des calculs bas niveau.

    - qqes personnes ont trouvé des documentations d'une centaine de pages, sûrement très intéressantes mais trop complexes pour le commun des mortels (je pense d'ailleurs que les personnes qui on fourni ces docs ne les ont pas lues: si elles l'avaient fait, elles auraient pû précisemment expliquer le phénomène en se basant sur la représentation machine dans le cas précis qui nous intéresse..)

    J'en conclus que le problème est trop complexe pour le développeur moyen...

    En tout cas merci pour vos efforts!

  4. #24
    Membre actif Avatar de vincent63
    Inscrit en
    Octobre 2005
    Messages
    198
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 198
    Points : 205
    Points
    205
    Par défaut
    'soir,
    Hop, me revoilà... pour la réponse à cette question, voir :

    http://www.developpez.net/forums/vie...32680&start=15

    où l'on a aussi débattu sur le sujet.

    (je pense d'ailleurs que les personnes qui on fourni ces docs ne les ont pas lues:
    Si c'est de moi qu'on parle... ben euh... c'est vrai... j'me suis endormi à la seconde page...
    "Ils ne savaient pas que c'était impossible... alors ils l'ont fait." Mark Twain

  5. #25
    bjb
    bjb est déconnecté
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 3
    Points : 8
    Points
    8
    Par défaut Nombre décimal != Nombre à virgule flotante
    Bonjour à tous,

    Pour résumer la situation le comportement que vous avez découvert n'est pas surprenant, vous aurez le même quelque soit le langage utilisé (à condition que le compilateur utilise vraiment les nombre à virgule flotante, désasembler pour en avoir le coeur net).

    En informatique on sépare deux catégories de nombre décimaux :
    - les nombres à virgule flotante : pratique, rapide (souvent utilisant les capacité d'un coprocesseur avec des instructions spécifiques)
    - les nombres décimaux "traditionels" : complexe & lent (car peu ou pas accéléré dans le matériel, sauf instructions additionelles)

    Les nombres à virgule flotante sont parfait pour : les calculs scientifiques (mesures d'élément réel, statistiques, 3D ...) car sauf besoin de précision absolu, la légère différence de valeur constatée n'aura aucune différence sur l'exactitude (signification) des résultats.

    En Java suivant si l'on à besoin de plus ou moins de précision, on choisira un type float (simple précision) ou un double (double précision) qui sont tout deux des types simples. Si l'on désire que le comportement des calculs flotant soit strictement compatible avec la norme IEEE, on peut utiliser le modificateur strictfp. Ceci sera peut-être un peu plus lent (optimisation moins agréssible de la VM), mais assurera une totale portabilité entre VM/microprocesseur.

    Par contre ces nombre à virgules ne doivent JAMAIS être utilisés en comptabilité car c'est une matière où les calculs doivent être exacts et suivre des règles d'arrondi stricts. A cet effet, il existe un type BigDecimal (un type complexe), qui permet de faire tous les calculs dont on a besoin tout en maitrisant intégralement le niveau de précision, d'arrondi, etc.
    Un peu de lecture avec des exemples de calculs de compta :
    http://javapronews.com/javapronews-47-20050509HowtheBigDecimalClassHelpsJavagetitsArithmeticRight.html

    Il en va de même pour tout calcul nécessitant coute que coute une exactitude absolue.

    Voilà, maintenant plus besoin de vous prendre la tête.

    A noter que cette différence existe à ma connaissance dans bon nombre de langage Java/C/C++/C#/Pascal ... (sauf encore une fois, directive particuliere de compilation surchargeant le comportement habituel) tout simplement car c'est une contrainte matérielle ;-)

    Un petit article dans une FAQ avec un lien sur tout celà serrait pas mal ..

    A+
    JB

  6. #26
    Gfx
    Gfx est déconnecté
    Expert éminent
    Avatar de Gfx
    Inscrit en
    Mai 2005
    Messages
    1 770
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    Points : 8 178
    Points
    8 178
    Par défaut
    J'en conclus que le problème est trop complexe pour le développeur moyen...
    Et j'en conclue que le developpeur moyen devrait apprendre comment fonctionne un ordinateur

    Une solution pour certains calculs qui doivent etre effectues sans perte de precision est d'utiliser une virgule fixe et des entiers ou des longs.
    Romain Guy
    Android - Mon livre - Mon blog

Discussions similaires

  1. Addition avec des variables "double"
    Par dieu08 dans le forum Débuter avec Java
    Réponses: 2
    Dernier message: 04/10/2012, 16h29
  2. [double] problème addition java
    Par franfr57 dans le forum Langage
    Réponses: 1
    Dernier message: 26/03/2009, 17h55
  3. [imprecis]Réaliser a^n avec seulement l'opérateur d'addition
    Par Amon dans le forum Algorithmes et structures de données
    Réponses: 18
    Dernier message: 08/11/2002, 22h22
  4. String -> long double (_strlold ?)
    Par haypo dans le forum C
    Réponses: 7
    Dernier message: 25/07/2002, 20h22
  5. Réponses: 3
    Dernier message: 12/06/2002, 21h15

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo