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 :

[Math]probleme de precision de calcul sur les float


Sujet :

Langage Java

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 31
    Points : 14
    Points
    14
    Par défaut [Math]probleme de precision de calcul sur les float
    Bonjour tout le monde
    bon alors la g un truc marrant (je ris jaune )
    voila le probleme je fais une boucle dans laquelle je fais un calcul sur des chaines de caractere que j ai parse en float .
    typiquement ca donne un truc dans ce style la :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    valueFloat += Float.parseFloat(monFloat.toString());
    .
    et la apres n iteration le calcul me fait une imprecision
    voila ma sortie:
    un ligne sur deux:
    - la valeur que je parse en float(avant parsing)
    - la somme de mes valeurs .
    R valeur ligne float18399.3
    R somme intermediaire pour float18399.3
    R valeur ligne float0.0
    R somme intermediaire pour float18399.3
    R valeur ligne float0.0
    R somme intermediaire pour float18399.3
    R valeur ligne float0.0
    R somme intermediaire pour float18399.3
    R valeur ligne float24407.75
    R somme intermediaire pour float42807.05
    R valeur ligne float0.0
    R somme intermediaire pour float42807.05
    R valeur ligne float19124.1
    R somme intermediaire pour float61931.15

    jusque la tout va bien mais apres ca marche plus faites le calcul
    R valeur ligne float23495.98
    R somme intermediaire pour float85427.125
    R valeur ligne float23495.98
    R somme intermediaire pour float108923.11
    R valeur ligne float19046.78
    R somme intermediaire pour float127969.89
    R valeur ligne float17690.65
    R somme intermediaire pour float145660.55
    R valeur ligne float19046.78
    R somme intermediaire pour float164707.33
    R valeur ligne float23495.98
    R somme intermediaire pour float188203.31

    Si qqu un a une indication je lui en serai infiniment reconnaissant merci d avance

  2. #2
    Membre expérimenté Avatar de herve91
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 282
    Points : 1 608
    Points
    1 608
    Par défaut
    C'est dû à la représentation interne des floats. Sur les 32 bits utilisés pour représenter un float, un certain nombre (je ne sais plus combien) sont réservés pour coder la mantisse en puissance de 2, 1 bit sert à coder le signe, et le reste l'exposant. La mantisse détermine le nombre de chiffres significatifs, qui doit être de l'ordre de 7. Pour plus d'info, se reporter à la norme IEEE 754. Si tu veux plus de précision (donc de chiffres significatifs), utilise des doubles, représentés sur 64 bits...

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 31
    Points : 14
    Points
    14
    Par défaut
    ben le pb c que meme en passant en double j'obtiens des resultat du style x.x99999999 alors que le chiffre que j additionne est x.x c bizarre comme truc je soupconne un mauvais fonctionnement de l addition qqu un a deja vu ca? En tout cas merci pour la rapidite de la reponse.

  4. #4
    Membre régulier
    Inscrit en
    Décembre 2003
    Messages
    99
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 99
    Points : 82
    Points
    82
    Par défaut
    Salut,

    As-tu essayer les BigDecimal ? Car si tu es en recherche de calcul de precision c'est la classe qu'il te faut ....

    Pour le bug sur les flottants ce ne peut etre du qu'à la précision limitée des floats .


    A+
    "Il n'existe que deux choses infinies, l'univers et la bêtise humaine... mais pour l'univers, je n'ai pas de certitude absolue." A. Einstein

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 31
    Points : 14
    Points
    14
    Par défaut
    ok ca roule merci beaucoup plus jamais je n utiliserai de float et de double

  6. #6
    Membre régulier
    Inscrit en
    Décembre 2003
    Messages
    99
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 99
    Points : 82
    Points
    82
    Par défaut
    Citation Envoyé par calvin
    ok ca roule merci beaucoup plus jamais je n utiliserai de float et de double
    Ca dépend de ce que tu veux faire ! La classe BigDecimal (ou BigInteger d'ailleurs) est moins perfomante que les types primitifs

    Elle ne devient utile que lorsque tu as besoin de beucoup de précision pour tes calculs (cas rare quand meme).

    En esperant t'avoir aider ...

    Cordialement.
    "Il n'existe que deux choses infinies, l'univers et la bêtise humaine... mais pour l'univers, je n'ai pas de certitude absolue." A. Einstein

  7. #7
    Membre expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Points : 3 080
    Points
    3 080
    Par défaut
    C'est comme, essaye d'exécuter ce code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    float f = 0;
    for(int i = 0; i < 10000; i++)
        f += 0.1;
     
    System.out.println(f);
    C'est normal, en base 2, 0.1 ne peut pas avoir une représentation exacte...

    0.1 (base 10) = 0,000110011001100110011001100110011001100110011001100..... (base 2)

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

Discussions similaires

  1. Calcul sur les heures
    Par franfr57 dans le forum Langage
    Réponses: 5
    Dernier message: 20/04/2006, 17h56
  2. [Dates] Calcul sur les dates...
    Par gawelldanor dans le forum Langage
    Réponses: 10
    Dernier message: 04/04/2006, 11h07
  3. Réponses: 12
    Dernier message: 31/03/2006, 20h02
  4. Probleme lors d'une recherche sur les forums
    Par JUSTIN Loïc dans le forum Mode d'emploi & aide aux nouveaux
    Réponses: 8
    Dernier message: 27/07/2005, 12h22
  5. [C#] Calcul sur les dates avec des DateTimePicker
    Par alizee971 dans le forum Windows Forms
    Réponses: 10
    Dernier message: 02/04/2005, 17h14

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