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 :

un nombre double très petit


Sujet :

Langage Java

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    122
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 122
    Par défaut un nombre double très petit
    Bonjour

    j'ai une question un peu bizzard pourquoi quand je fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    nouveau[j]=(double)((1/(Math.pow(2,1900)))/255)*n;//nouveau est de type double et
    // n est un entier
    ça me donne 0.0 je sais que le nombre est très très petit mais de là à être 0?????

    merci à vous

  2. #2
    Membre très actif Avatar de unknow0
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 452
    Par défaut
    Bonjour,

    je pence que soit le nombre et plus petit que la precision minimum d'un double donc 0
    (ton nombre et dans les 10^-500) donc bon c'est un peu normal qu'il soit interpreter comme 0

    Edit: les double java vont de 4.9*10^-324 à 1.7*10^308.
    Cordialement.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    122
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 122
    Par défaut
    merci à toi unknow0

    ok j'ai compris donc comment je fait je veux dire y a pas (plus grand plus petit que double) pour contenir mon nombre???

    j'ai une autre question voilà j'ai un nombre x
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1.6835343706332576E-301
    et un nombre y
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    4.5002377277716526E-272
    je fais x+y et ça me donne y
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    4.5002377277716526E-272
    je fais y-x et ça me donne y
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    4.5002377277716526E-272
    j'ai conclu que quand y supérieur beaucoup à x ce dernier est réduit à 0!!!

    corrigez moi si je me trompe et si vous avez une solution pour que x soit pris en considération!!

    merci à vous

  4. #4
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 969
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 969
    Par défaut
    Lie,

    Il n'y a pas de solution avec des double, puisque tu atteins la limite des valeurs représentables.

    Il y a la classe BigDecimal qui pourra faire ce que tu cherches, voir la JavaDoc.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    122
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 122
    Par défaut
    salut droggo et merci encore
    j'ai vu un peu la doc de la classe Math.BigDecimal et voila
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    int n;BigDecimal[] nouveau=new BigDecimal[nb]; 
    for(int j=0;j<nb;j++){
    			n=Msg[j]& 0xFF;
    			//nouveau[j]=(double)((1/(Math.pow(2,x)))/255)*n;
    		 nouveau[j] = new BigDecimal (((1/(Math.pow(2,x)))/255)*n);
    nouveau[j] = new BigDecimal (((1/(Math.pow(2,1900)))/255)*n);}
    mais nouveau[j] est toujours égal à 0 j'ai peut être fait une erreur dans le code!!??

    merci à vous

  6. #6
    Membre Expert Avatar de guigui5931
    Profil pro
    Chef de projet NTIC
    Inscrit en
    Avril 2006
    Messages
    1 667
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 667
    Par défaut
    A mon avis ton problème vient du fait que quand tu fais par exemple
    tu divise l'int 1 par l'int 255 le résultat est donc un int (donc sans virgule) donc arrondi à 0.Il faut que tu convertisse tous tes chiffres en bigDecimal (ou au moins en double) avant de les manipuler.

  7. #7
    Membre très actif Avatar de unknow0
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 452
    Par défaut
    Citation Envoyé par pipip Voir le message
    merci à toi unknow0

    ok j'ai compris donc comment je fait je veux dire y a pas (plus grand plus petit que double) pour contenir mon nombre???

    j'ai une autre question voilà j'ai un nombre x
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1.6835343706332576E-301
    et un nombre y
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    4.5002377277716526E-272
    je fais x+y et ça me donne y
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    4.5002377277716526E-272
    je fais y-x et ça me donne y
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    4.5002377277716526E-272
    j'ai conclu que quand y supérieur beaucoup à x ce dernier est réduit à 0!!!

    corrigez moi si je me trompe et si vous avez une solution pour que x soit pris en considération!!

    merci à vous
    Dans ses calcul x et pris en compte seulement il change les valeur a 30 decimal apres la virgule ce n'est donc pas visible ici de plus il est comme tu l'a dit posible qu'il soit ignorer si il trop petit :s mais la on en revient a la precision d'un double

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    122
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 122
    Par défaut
    merci mais oulala j'y suis encore

    j'ai essayé ce que tu m'a dis guigui5931 et j'ai tout transformer en bigDecimal
    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
    int n;
    BigDecimal[] nouveau=new BigDecimal[nb];
    		BigDecimal two = new BigDecimal ( "2.0" );
    		BigDecimal dc = new BigDecimal ( "255.0" );
    		BigDecimal one = new BigDecimal ( "4.0" );
    		BigDecimal po=two.pow(1);
     
    	for(int j=0;j<nb;j++){
    		n=Msg[j]& 0xFF;
    		BigDecimal nn = new BigDecimal ( n ); 		
    		nouveau[j] =(one.divide(po)).divide(dc).multiply(nn);
    	        System.out.println( nouveau[j]);
     
     
     
    		}
    mais la erreur
    Exception in thread "main" java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.
    je pense que cette erreur est du au fait que le résultat de la division est infini

  9. #9
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 969
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 969
    Par défaut
    Xoe,
    Citation Envoyé par pipip Voir le message
    je pense que cette erreur est du au fait que le résultat de la division est infini
    Oui, il faut lire la JavaDoc, et agir en conséquence.

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    122
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 122
    Par défaut
    salut

    il faut lire la JavaDoc, et agir en conséquence.
    oui effectivement mais il y a 12h je ne connaissais pas l'existence de la classe Math.BigDecimal donc j'ai un peu eu du mal à me situer mais ça vas mieux maintenant je m'y habitue et j'ai fais quelques nouvelles bricoles sur mon programme et ça marche
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    int n;BigDecimal[] nouveau=new BigDecimal[nb];java.math.MathContext v =new java.math.MathContext(10^700);
    		BigDecimal two = new BigDecimal ( "2.0" );
    		BigDecimal dc = new BigDecimal ( "255.0" );
    		BigDecimal one = new BigDecimal ( "1.0" );
    		BigDecimal po=two.pow(y);
     
    		for(int j=0;j<nb;j++){
    			n=Msg[j]& 0xFF;
    			BigDecimal nn = new BigDecimal ( n ); 
    			nouveau[j]=((one.divide(po,v)).divide(dc,v)).multiply(nn);
     
    		}
    a+

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

Discussions similaires

  1. precision et très petits nombres
    Par membreComplexe12 dans le forum C
    Réponses: 9
    Dernier message: 11/05/2011, 16h03
  2. Calculs sur de très petits nombres (0-255)
    Par Kaluza dans le forum Langage
    Réponses: 11
    Dernier message: 06/04/2011, 15h13
  3. soustraction avec un très petit nombre
    Par djocin dans le forum Fortran
    Réponses: 10
    Dernier message: 13/07/2010, 08h26
  4. Equivalent Cygwin mais très petit
    Par chris_wafer_2001 dans le forum Autres Logiciels
    Réponses: 5
    Dernier message: 22/11/2005, 09h03
  5. Réponses: 8
    Dernier message: 21/11/2005, 17h18

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