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 :

Probleme de calcul simple en Java


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Mai 2005
    Messages
    82
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 82
    Par défaut Probleme de calcul simple en Java
    Bonjour,

    Je n'arrive pas a faire un calcul en Java, alors qu'il est tres simple.

    Je veux faire l'operation:
    (220 * (2^24)) + (196 * (2^16)) + (49 * (2^8)) + 184 = 3 703 845 304

    Mais en Java, en faisant le code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    int a, b, c, d;
    a = 220;
    b = 196;
    c = 49;
    d = 184;
    int r = (a * (int) Math.pow(2,24)) + (b * (int) Math.pow(2,16)) + (c * (int) Math.pow(2,8)) + d;
    System.out.println("r " + r);
    int r2 = (a * (2^24)) + (b * (2^16)) + (c * (2^8)) + d;
    System.out.println("r2 " + r2);
    Voila le resultat:
    ???

    Quelqu'un a une idee du probleme?

    Merci,

    Dazdh

  2. #2
    Membre éprouvé
    Avatar de Deadpool
    Homme Profil pro
    Inscrit en
    Novembre 2005
    Messages
    1 312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 1 312
    Par défaut
    Bonjour.

    Surement un dépassement de capacité.

    Le type int ne peut contenir que des valeurs comprises entre -2 147 483 648 et 2 147 483 647.

    Essaie en utilisant le type long.

  3. #3
    Expert éminent
    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
    Billets dans le blog
    1
    Par défaut
    Salut,

    Bonne nouvelle le calcul est bon

    Ton problème est tout simple et tiens en un chiffre : 2 147 483 647
    Il s'agit ni plus ni moins que la valeur de Integer.MAX_VALUE, c'est à dire la valeur maximal que peut prendre un int. On est loin de ton résultat de 3 703 845 304 !!!


    La solution consiste tout simplement à utiliser un type plus grand : long (jusqu'à 9 223 372 036 854 775 807).
    Si tu as vraiment besoin de valeur encore plus grande, alors il faudra te tourner vers la classe BigInteger...

    a++

  4. #4
    Membre confirmé
    Inscrit en
    Mai 2005
    Messages
    82
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 82
    Par défaut
    Merci de vos reponses.

    En effet ca marche mieux avec un long

    Mais voila une autre question. Voila maintenant mon code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    long a, b, c, d;
    a = 220;
    b = 196;
    c = 49;
    d = 184;
    long r = (a * (long) Math.pow(2,24)) + (b * (long) Math.pow(2,16)) + (c * (long) Math.pow(2,8)) + d;
    System.out.println("r " + r);
    long r2 = (a * (2^24)) + (b * (2^16)) + (c * (2^8)) + d;
    System.out.println("r2 " + r2);
    qui me donne
    Pourquoi r2 vaut 9922 ?

    Merci,

    Dazdh

  5. #5
    Modérateur
    Avatar de nouknouk
    Homme Profil pro
    Inscrit en
    Décembre 2006
    Messages
    1 655
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 655
    Par défaut
    Citation Envoyé par Dazdh Voir le message
    Pourquoi r2 vaut 9922 ?
    l'opérateur ^ signifie bitwise exclusive or ( <=> ou exclusif bit par bit). Si toi tu veux faire a puissance b, c'est ta première solution avec Math.pow() qu'il faut utiliser.

    Ou alors, dans le cas bien précis de multiplications/divisions par des puissances de deux, c'est les opérateurs de décalage de bits (bitwise shift operators : << , >> et >>>) qu'il faut utiliser.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    long r2 = ((long)a << 24) + ((long)b << 16) + ((long)c << 8) + d;
    EDIT: attention à la priorité de l'opérateur <<, les parenthèses étant indispensables.

Discussions similaires

  1. Probleme de calcul Matlab Java
    Par Papypsyco dans le forum Général Java
    Réponses: 2
    Dernier message: 27/05/2014, 12h21
  2. Problème calcul simple JAVA
    Par absot dans le forum Général Java
    Réponses: 4
    Dernier message: 03/06/2010, 21h44
  3. Réponses: 17
    Dernier message: 16/07/2004, 12h19
  4. [choix langage] calcul,graphiques,portabilite: java ou c++?
    Par brassouille dans le forum Langages de programmation
    Réponses: 12
    Dernier message: 15/07/2004, 11h09
  5. Edition d'un simple fichier java
    Par mcrepin dans le forum Eclipse Java
    Réponses: 5
    Dernier message: 21/03/2003, 14h28

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