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 :

Précision d'un très très grand nombre


Sujet :

Langage Java

  1. #1
    Membre du Club
    Inscrit en
    Novembre 2003
    Messages
    69
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 69
    Points : 59
    Points
    59
    Par défaut Précision d'un très très grand nombre
    Bonjour à tous, j'ai un petit problème assez serieux quand même.

    Voilà je dois manipuler de grand grand très grand nombre qui comporte beaucoup de chiffres.

    Pour vous donner un exemple :
    Valeur :7.455398332284931E46
    Et voilà le problème, c'est que quand je l'enregistre dans un DOUBLE , il me met la notation scientifique (genre : xxxxxxxxxxx^46).

    Je vous explique... j'utilise SHA qui me donne une clé de 160bits que je transforme en HEX puis en DECIMAL (en utilisant pow(16,i)).

    La transformée BYTE--> HEX marche nickel et sans perte de précision.
    Pour la transformée HEX--> DEC, je l'ai crée moi-même mais le résultat fait que je perds une grand précision. Voici mon code (en cas si j'ai fait une erreur quelque part mais je ne pense pas) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
       public double hexToInt(String Nombre)
        {
            double solution =0;
            int taille = Nombre.length();
            int i=0;
            while (i < taille)
            {
           String A=(String) Nombre.substring((taille-i-1),(taille-i));
           solution=solution+Integer.valueOf(A,16)* Math.pow(16,i);
            i++;     
            }
            System.out.println("Solution:"+solution);
            return solution;
        }

    La méthode Mathématique POW utilise des doubles mais quand je demande l'affichage du resultat (qui est enregistré dans une variable de type DOUBLE), il me met cette notion scientifique.

    Donc si quelqu'un a une solution, car après le grand résultat subit un modulo et donc je dois être extremement précis.

    Merci d'avance pour vos réponses

  2. #2
    Membre expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Points : 3 675
    Points
    3 675
    Par défaut
    Hello,

    pour avoir une précision suffisante, je te conseille de jeter un coup d'oeuil à la classe BigDecimal, qui est faite pour ça (mais attention à sa lenteur !!!)

    Sinon, il y a aussi le mot réservé "stricfp", qui permet d'améliorer la précision, mais je ne l'ai jamais utilisé, car le gain n'est pas du tout du même acabit qu'avec la classe BigDecimal...

    "Le plug gros problème des citations trouvées sur internet, c'est qu'on ne peut jamais garantir leur authenticité"

    Confucius, 448 av. J-C

  3. #3
    Membre du Club
    Inscrit en
    Novembre 2003
    Messages
    69
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 69
    Points : 59
    Points
    59
    Par défaut
    Je suis en train de regarder BigDécimal mais j'ai oublier de dire que mes nombres sont tous des entiers. BigDécimal marche aussi pour les nombre entiers de puissance 40-60?

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    633
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 633
    Points : 711
    Points
    711
    Par défaut
    Bonjour,
    Citation Envoyé par sniperseb
    Je suis en train de regarder BigDécimal mais j'ai oublier de dire que mes nombres sont tous des entiers. BigDécimal marche aussi pour les nombre entiers de puissance 40-60?
    Alors c'est BigInteger qu'il te faut.
    Compilation sans erreur ne signifie pas programme sans erreur.
    L'indentation n'a pas été imaginée pour faire beau, mais pour faciliter la lecture des programmes.

  5. #5
    Membre du Club
    Inscrit en
    Novembre 2003
    Messages
    69
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 69
    Points : 59
    Points
    59
    Par défaut
    Je vous dit Chapeau bas pour le temps de réponse à mon problème.

    La solution est bien un BigInteger qui sera la réponse à mon problème.

    Sinon Pill_S je te remercie pour aussi BigDecimal que j'aurai besoin surêment bientot .

    Vive Developpez.com

  6. #6
    Membre expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Points : 3 675
    Points
    3 675
    Par défaut
    Citation Envoyé par sniperseb
    Je vous dit Chapeau bas pour le temps de réponse à mon problème.
    Tout le mérite te revient... Un problème énoncé clairement est plus vite résolu

    Citation Envoyé par sniperseb
    Vive Developpez.com
    Je suis bien d'accord avec toi !
    "Le plug gros problème des citations trouvées sur internet, c'est qu'on ne peut jamais garantir leur authenticité"

    Confucius, 448 av. J-C

  7. #7
    Membre du Club
    Inscrit en
    Novembre 2003
    Messages
    69
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 69
    Points : 59
    Points
    59
    Par défaut
    Et pour finir ce topic, j'ai trouvé un super exemple d'application de BigInteger Donc si vous voulez le tester, voici le code que j'ai trouvé.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
     
    package fpdemo3;
     
    import java.math.BigInteger;  // Import BigInteger from java.math package
    import java.util.*;  // Import all classes (including Vector) from java.util
     
    /**
     * This version of the program uses arbitrary precision integers, so it does
     * not have an upper-bound on the values it can compute.  It uses a Vector
     * object to cache computed values instead of a fixed-size array.  A Vector
     * is like an array, but can grow to any size.  The factorial() method is
     * declared "synchronized" so that it can be safely used in multi-threaded
     * programs.  Look up java.math.BigInteger and java.util.Vector while 
     * studying this class.
     **/
    public class Fpdemo3 {
      protected static Vector table = new Vector();       // create cache
      static { table.addElement(BigInteger.valueOf(1)); } // initialize 1st element
     
      /** The factorial() method, using BigIntegers cached in a Vector */
      public static synchronized BigInteger factorial(int x) {
        if (x < 0) throw new IllegalArgumentException("x must be non-negative.");
        for(int size = table.size(); size <= x; size++) {
          BigInteger lastfact = (BigInteger)table.elementAt(size-1);
          BigInteger nextfact = lastfact.multiply(BigInteger.valueOf(size));
          table.addElement(nextfact);
        }
        return (BigInteger) table.elementAt(x);
      }
     
      /**
       * A simple main() method that we can use as a standalone test program
       * for our factorial() method.  
       **/
      public static void main(String[] args) {
        for(int i = 1; i <= 100; i++) System.out.println(i + "! = " + factorial(i));
      }
    }

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

Discussions similaires

  1. BDD sur réseau très très très lent...
    Par ericain dans le forum Access
    Réponses: 12
    Dernier message: 20/02/2015, 17h17
  2. newSchema(url) exécution très très très lente
    Par schum-hacker dans le forum Général Java
    Réponses: 6
    Dernier message: 21/01/2013, 09h32
  3. Logiciel intranet très très très lent
    Par openeyes dans le forum ALM
    Réponses: 7
    Dernier message: 15/02/2011, 15h16
  4. Améliorer les performances - très (très) (très) grands datasets
    Par debdev dans le forum Administration et Installation
    Réponses: 6
    Dernier message: 08/01/2010, 16h46
  5. Démarrage trés, trés, trés difficile
    Par Cazaux-Moutou-Philippe dans le forum AWT/Swing
    Réponses: 9
    Dernier message: 29/06/2008, 10h45

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