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

avec Java Discussion :

Conversion en Java - examen


Sujet :

avec Java

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2010
    Messages : 10
    Points : 8
    Points
    8
    Par défaut Conversion en Java - examen
    Bonjour,

    Je suis actuellement étudiant en informatique et, les examens approchant, je m'entraine à l'aide de questions posées aux examens précédents et fournies par le prof pour s'exercer. Pour une de ces questions, j'ai un problème et je ne comprend vraiment pas comment y répondre. Celle-ci concerne un problème de conversion et, malgré mes lectures sur le sujet, je me vois toujours dans l'incapacité de trouver la solution
    C'est pourquoi je me permet de poster sur ce forum en espérant y trouver l'aide dont j'ai besoin
    Je vous donne la question (qui est en fait composée de deux sous-questions) :

    Considérons l'expression a + b + c où les trois variables a, b et c sont déclarées de type long.

    (a) Donnez un exemple (valeurs des trois variables) où le résultat théorique du calcul de cette expression est représentable dans le type long mais où le calcul de l'expression en Java produira un résultat incorrect. Justifiez.

    (b) Ajoutez des parenthèses à l'expression pour que le résultat du calcul soit correct dans le cas de votre exemple. Expliquez.

    Je ne vois vraiment pas pourquoi le résultat de a+b+c serait incorrect s'il est représentable en type long...

    Merci d'avance pour votre aide !

  2. #2
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    simple logique d'ordre des opérateur en java.

    a+b+c sera interprété en java par (a+b)+c

    si (a+b) dépasse un peu la longureur d'un long est que c est suffisament négatif, on a un résultat final thérorique qui rentre dans un long mais un calcul incorrect.

    Exemple

    a = Long.MAX_VALUE ;
    b = 50 ;
    c = -100;

    edit:
    enfin, tout ça est théorique, en pratique, avec la gestion de débordement tu n'aura non pas 1 mais deux débordement qui vont se compenser donc, meme avec les extrèmes Donc je retire ce que j'ai dit, je vois pas

  3. #3
    Futur Membre du Club
    Inscrit en
    Juillet 2010
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 4
    Points : 5
    Points
    5
    Par défaut
    Je ne sais pas ce vous entendez par gestion des débordements. Il me semble qu'on peut très bien avoir un dépassement.

    En effet, un long est stocké sur 64 bits et le premier bit correspond au signe.
    La valeur maximale d'un Long est 2^63 -1.
    Si on ajoute 1 on a un dépassement et on obtient - 2^63.

    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    		long a = Long.MAX_VALUE;
    		long b = 1;
    		long c = 0;
    		long res = a + b + c;
    		System.out.println(a); // 9223372036854775807
    		System.out.println(res); // -9223372036854775808

  4. #4
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    fb1: oui, sauf que la question disait clairement "le résultat théorique rentre dans un long". Hors, dans ce cas là, on obtiens toujours la bonne réponse, même après débordement. Car on aura débordement dans un sens (exemple: dépasser la taille max de Long, on tombe dans les grands négatifs), puis débordement dans l'autre pour revenir dans le range des long (cf l'intitulé de l'exercice).

    en reprenant mon exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    a = Long.MAX_VALUE ;
    b = 50 ;
    long intermediaire = a+b;  // débordement, a+b est négatif, résultat erroné
    c = -100;
    long resultat = intermediaire + c; // redébordement, on obtiens bien la bonne valeur 
    resultat == Long.MAX_VALUE-50; // !

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2010
    Messages : 10
    Points : 8
    Points
    8
    Par défaut
    Bonjour,

    Tout d'abord, je tenais à vous remercier de vos réponses et de votre intérêt pour ma question.

    Dans le cas de fb1-kamo, je comprend que le résultat est représentable et pourtant faux.
    Par contre, comme le dit tchize_ , si java calcule de lui-même comme s'il y avait des parenthèses, comment répondre au point (b) de la question ? Et puis, comment des parenthèses pourraient-elles arranger un problème de "trop de bits" utilisés ?

    Il est également demander d'écrire un programme java qui calcule le resultat correct... Je pensais pouvoir le faire en connaissant la réponse à la première question mais, si le problème se situe au niveau des bits utilisé je ne conçois vraiment pas comment faire

    En tous cas, encore merci pour votre aide !

  6. #6
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    demandez la réponse à votre prof, personnellement, après 6 ans de dev java, j'en trouve aucun Et dans le cas de fb1, le résultat théorique est Long.MAX_VALUE + 1, il n'est donc pas représentable.

    Java ignore simplement les overflow, ainsi

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    package test;
    public class Test{
        public static void main(String[] argv){
            long a,b,c;
            a= Long.MAX_VALUE;
            b =Long.MAX_VALUE;
            c =Long.MIN_VALUE;
            System.out.println(""+(a+b+c));
            System.out.println(""+(a+(b+c)));
        }
    }
    Donne dans les deux cas la bonne réponse. Même chose quand on échange MAX et MIN dans les valeurs. Et là on est aux extrèmes.

  7. #7
    Futur Membre du Club
    Inscrit en
    Juillet 2010
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 4
    Points : 5
    Points
    5
    Par défaut
    Effectivement. Il serait intéressant d'avoir la réponse du prof

Discussions similaires

  1. Conversion matlab / java
    Par coolgeff dans le forum MATLAB
    Réponses: 6
    Dernier message: 26/06/2006, 17h44
  2. Réponses: 2
    Dernier message: 30/05/2006, 08h04
  3. [Conversion]Applet Java Vers Java Web Start
    Par robin206 dans le forum JWS
    Réponses: 2
    Dernier message: 20/04/2005, 09h28
  4. [Conversion] conversion C++ ---> Java
    Par marc26 dans le forum Général Java
    Réponses: 16
    Dernier message: 30/03/2005, 19h41
  5. [Java] Examen de la certification Sun
    Par chady dans le forum Certifications
    Réponses: 8
    Dernier message: 23/12/2004, 14h11

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