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 :

précision, math et Bigdecimal


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Avatar de polymorphisme
    Homme Profil pro
    Publishing
    Inscrit en
    Octobre 2009
    Messages
    1 460
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Publishing
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2009
    Messages : 1 460
    Par défaut précision, math et Bigdecimal
    Bonjour,

    je cherche à obtenir les fonctions élémentaires (cos, asinh, log, exp, ...) avec une précision donnée.

    Je me suis aperçus que les méthodes de la classe java.lang.math retournaient généralement des doubles et donc que je ne pouvais obtenir une bonne précision. La classe java.lang.StrictMath ne semble pas apporter grand chose de plus.

    Je me suis alors tourner vers le paquetage java.math. Les BigDecimal gèrent bien la précision mais les fonctions mathématiques sont quasiment restreintes aux opérations arithmétiques élémentaires (+, -, *, /).

    Une idée ?

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    338
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2008
    Messages : 338
    Par défaut
    Les méthodes sin, cos,... dans java.lang.Math sont natives (écrites dans un autre langage que java) pour une question de performances. Je ne sais pas si tu travailles dans un domaine sensible mais l'implémentation fournie est suffisante dans la plupart des cas (un double a déjà une grande précision 64bit). Si tu veux une autre API plus précise alors développe la tienne en utilisant le développement limitée de ces fonctions ou un autre algorithme sur ce lien http://www.trigofacile.com/maths/tri...dic/cordic.htm..

  3. #3
    Membre Expert
    Avatar de polymorphisme
    Homme Profil pro
    Publishing
    Inscrit en
    Octobre 2009
    Messages
    1 460
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Publishing
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2009
    Messages : 1 460
    Par défaut
    Mon but est de faire une calculette.

    > l'implémentation fournie est suffisante dans la plupart des cas (un double a
    > déjà une grande précision 64bit.

    Une bonne précision soit, mais voici une simple soustraction de deux doubles

    12.34 - 12.0 = 0.33999999999999986

    Il est impensable qu'une calculatrice affiche un tel résultat !
    Et, on image la suite si l'on essaye de faire plusieurs opérations de suite.

    Il est clair que l'utilisation des BigDecimal resouds le problème.

    Faudrais t-il alors implémenté avec des BigDecimal l'algorithme proposé sur la page http://mathsetcalculs.perso.neuf.fr/Maths/cordic.htm ? (merci pour l'url).

    Je suis étonné qu'il n'existe pas déjà une bibliothèque répondant à ce soucis !

  4. #4
    Membre chevronné
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    338
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2008
    Messages : 338
    Par défaut
    Même un bigDecimal ne ferai pas l'affaire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.out.println(new BigDecimal(12.34).subtract(new BigDecimal(12.0)));
    résultat:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    0.339999999999999857891452847979962825775146484375
    On a une précision limitée quoiqu'on fasse (regarde la représentation des nombre flottant sur un PC qui est une puissance de 2!).

  5. #5
    Membre expérimenté Avatar de Torg666
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2008
    Messages
    230
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2008
    Messages : 230
    Par défaut
    Citation Envoyé par hibour Voir le message
    Même un bigDecimal ne ferai pas l'affaire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.out.println(new BigDecimal(12.34).subtract(new BigDecimal(12.0)));
    résultat:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    0.339999999999999857891452847979962825775146484375
    On a une précision limitée quoiqu'on fasse (regarde la représentation des nombre flottant sur un PC qui est une puissance de 2!).
    Convertie ts float ou double en chaine de caraterespar exemple comme ca:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    new BigDecimal(""+12.34).subtract(new BigDecimal(""+12.0));
    avec ca tu devrai bien obtenir 0.34.

    Le souci a été evoqué à de multiple reprise... suffit de chercher

  6. #6
    Membre Expert Avatar de Uther
    Homme Profil pro
    Tourneur Fraiseur
    Inscrit en
    Avril 2002
    Messages
    4 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Tourneur Fraiseur

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 690
    Par défaut
    Citation Envoyé par hibour Voir le message
    Même un bigDecimal ne ferai pas l'affaire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.out.println(new BigDecimal(12.34).subtract(new BigDecimal(12.0)));
    résultat:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    0.339999999999999857891452847979962825775146484375
    On a une précision limitée quoiqu'on fasse (regarde la représentation des nombre flottant sur un PC qui est une puissance de 2!).
    Non les BigDecimal résolvent bien son problème. Comme le nom l'indique il ne reposent sur une représentation en base dix contrairement aux float/double en base 2.
    Si ton exemple ne marche pas, c'est parce que tu passes d'abord par des floats qui sont ensuite convertis en BigDecimal.

    Si tu fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.out.println(new BigDecimal("12.34").subtract(new BigDecimal("12.0")));
    le résultat est correct.

  7. #7
    Membre chevronné
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    338
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2008
    Messages : 338
    Par défaut
    Citation Envoyé par Uther Voir le message
    Non les big décimal résolvent bien son problème. Si tton exemple ne marche pas, c'est parceque tu passes d'abord par des floats(approximations) qui sont ensuite convertis en BigDecimal.

    Si tu fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.out.println(new BigDecimal("12.34").subtract(new BigDecimal("12.0")));
    le résultat est correct.
    Il faudrai mettre le BigDecimal comme un type natif en java ça résoudra quelque soucis
    quand on écrira :
    cela se traduira automatiquement par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    BigDecimal x = new BigDecimal("12.34");
    Il faut pas oublier que question performance les opération avec des BigDecimal est beaucoup plus lente que les type float, double..

Discussions similaires

  1. précision math module
    Par vega95 dans le forum Calcul scientifique
    Réponses: 10
    Dernier message: 06/01/2009, 07h53
  2. limiter la précision du BigDecimal
    Par ericw78 dans le forum Services Web
    Réponses: 1
    Dernier message: 26/05/2008, 23h27
  3. Problème de précision avec BigDecimal
    Par Iris12 dans le forum API standards et tierces
    Réponses: 4
    Dernier message: 10/05/2007, 16h14
  4. [Math] Bigdecimal & pow
    Par thomasvst dans le forum API standards et tierces
    Réponses: 6
    Dernier message: 12/03/2007, 16h14
  5. Réponses: 3
    Dernier message: 30/08/2006, 21h30

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