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

Java Discussion :

Soustraction de deux doubles


Sujet :

Java

  1. #1
    Membre expert
    Avatar de MarieKisSlaJoue
    Homme Profil pro
    Ingénieur Cloud
    Inscrit en
    Mai 2012
    Messages
    1 145
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Roumanie

    Informations professionnelles :
    Activité : Ingénieur Cloud
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2012
    Messages : 1 145
    Points : 3 653
    Points
    3 653
    Billets dans le blog
    20
    Par défaut Soustraction de deux doubles
    Bonjour/Bonsoir, j'ai une question toute simple. Mais j'aimerai avoir une réponse complète sur le pourquoi.

    Si je fait

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.out.println(43.12 - 33.88);
    Java m'affiche 9.239999999999995
    Déjà c'est très bizarre mais bon.
    Si maintenant je fais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.out.println(43.12 - 33.88 - 9.24);
    c'est la dégringolade -5.329070518200751E-15

    Je pensais au début que ça venais de la façon donc java stocker ses double en mémoire. Mais ça ne semble pas venir de là. Donc comme il peut se planter autant sur une soustraction ? Alors que d'autre langage comme php arrive très bien à gérer ce cas ?

    Merci d'avance
    Ce post à été écrit par un panda
    Apollo 11 - AGC revue de code
    -- qwerty keybord

  2. #2
    Membre chevronné
    Inscrit en
    Mai 2006
    Messages
    1 364
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 1 364
    Points : 1 984
    Points
    1 984
    Par défaut
    Citation Envoyé par MarieKisSlaJoue Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.out.println(43.12 - 33.88);
    Java m'affiche 9.239999999999995
    Déjà c'est très bizarre mais bon.
    En fait, c'est un probleme de codage. Un double correspond à un nombre réel. Entre 2 nombre réels, il y a une infinité de nombre réels. Or, en java comme dans tout langage informatique, les variables sont stockées sur un certain nombre de bits (64 pour un double). Les doubles sont codés avec 52 bits pour la valeur, 11 bits pour l'exposant et 1 bit pour le signe. Lors d'un calcul élémentaire, il y a donc un erreur possible de 2^-53.

    Citation Envoyé par MarieKisSlaJoue Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.out.println(43.12 - 33.88 - 9.24);
    c'est la dégringolade -5.329070518200751E-15
    Le résultat exacte de ton calcul devrait etre 0. Note bien que le chiffre derriere le E correspond à l'exposant. Tu as donc environ 5*10^-15 d'erreur. Bref, c'est tres faible
    Et l'explication est la meme.

    Note aussi que ces problemes ne sont pas liés au langage mais à comment le processeur fait ses calculs. D'ailleurs, si tu cherches sur google "erreur calcul double", tu trouveras des résultats beaucoup plus surprenants que ce que tu as observé.
    Pour conclure, si tu as besoin d'une précision supérieure à ce que te propose double, il faut passer par des classes dédiés comme BigDecimal

  3. #3
    Membre expert
    Avatar de MarieKisSlaJoue
    Homme Profil pro
    Ingénieur Cloud
    Inscrit en
    Mai 2012
    Messages
    1 145
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Roumanie

    Informations professionnelles :
    Activité : Ingénieur Cloud
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2012
    Messages : 1 145
    Points : 3 653
    Points
    3 653
    Billets dans le blog
    20
    Par défaut
    Merci pour tes explications. J'avais tester aussi avec des BigDecimal. Mais à vrai dire moi je m'attendais à ce que Java "Triche" comme doivent le faire d'autre langage du coup (C++, python) qui eux renvoie bien le résultat tel que l'ont l'attendrai.
    Ce post à été écrit par un panda
    Apollo 11 - AGC revue de code
    -- qwerty keybord

  4. #4
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par MarieKisSlaJoue Voir le message
    Merci pour tes explications. J'avais tester aussi avec des BigDecimal. Mais à vrai dire moi je m'attendais à ce que Java "Triche" comme doivent le faire d'autre langage du coup (C++, python) qui eux renvoie bien le résultat tel que l'ont l'attendrai.
    Les nombres flottant fonctionnent de la même manière dont tous les langages, et le problème apparait également en C++ et Python :

    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    	cout << 43.12 - 33.88 - 9.24; // -5.32907e-15
    Demo : http://ideone.com/vg86cb

    Code Python : Sélectionner tout - Visualiser dans une fenêtre à part
    	print (43.12 - 33.88 - 9.24); # -5.3290705182e-15
    Demo : http://ideone.com/1Elf8j

    En fait le résultat varie juste selon la manière dont tu affiches le résultat, car la précision peut varier.
    Il faut quand même afficher plus de 10 chiffres après la virgule pour voir le problème.

    a++

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [MySQL] soustraction de deux nombre de type double
    Par magda62 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 17/06/2009, 15h00
  2. Soustraction de deux tables jumelles
    Par Mathouxxx dans le forum Access
    Réponses: 4
    Dernier message: 12/10/2005, 08h46
  3. [xslt] soustraction de deux variables
    Par nemya dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 28/09/2005, 10h58
  4. [SQL ORACLE] Soustraction de deux timestamps
    Par platinum07 dans le forum SQL
    Réponses: 34
    Dernier message: 02/07/2004, 10h42
  5. [Date] Soustraction de deux dates ?
    Par nesbla dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 29/03/2004, 11h54

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