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 :

Overflows numériques, pourquoi Java ne les gère pas ?


Sujet :

Langage Java

  1. #1
    Expert éminent sénior
    Avatar de Baptiste Wicht
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    7 431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Suisse

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

    Informations forums :
    Inscription : Octobre 2005
    Messages : 7 431
    Points : 21 324
    Points
    21 324
    Par défaut Overflows numériques, pourquoi Java ne les gère pas ?
    Bonjour,

    Je me demandais s'il y avait une raison au fait que Java ne gère pas les overflows des types numériques ?

    Parce qu'en fait, je pense que c'est très largement possible de le faire dans le langage et ce serait tout de même plus confortable pour l'utilisateur et évidemment une source d'erreur en moins...

    Je dis ça, parce que j'ai vu une présentation d'un programme permettant de détecter les overflow de types numériques dans un programme quelconque et j'ai trouvé étonnant que Java ne le fasse pas lui-même...

    Qu'en dites-vous ?

    Pensez-vous que ce soit juste pas simplicité ou est-ce qu'il y a une meilleure raison ? Et pensez-vous que ce soit une bonne idée de ne pas gérer ces overflows ou non ?

    ======

    Pour ceux qui ne savent pas de quoi, je parle, essayez le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int i = 100000 * 500000;
    System.out.println(i);
    Logiquement, ce calcul devrait donner 50000000000, mais ce nombre est plus grand que la valeur maximale de int (2147483647) et Java vous donne ce résultat :

    -1539607552
    Bluffant, non ?

    En fait, c'est tout simplement parce que le int étant codé sur du 32 bits, Java calcule le résultat et ne prend que les 32 derniers bits du résultat et les redonne.

    Ce qui nous donne un nombre négatif...

    Pour ceux qui ont de la peine avec le binaire, vous pouvez vous représenter ça comme un cercle dans lequel on tourne infinement, quand on atteint la limite maximale du nombre, on continuer à tourner mais le prochain nombre est le plus petit du type.

    Donc si vous prenez la valeur maximale de int et vous lui rajoutez un, vous arrivez à la valeur minimale de int (-2147483648).

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 116
    Points : 120
    Points
    120
    Par défaut
    Je ne vois pas comment il pourair gerer le overflow.
    Lancer une exception a chaque operation numerique. Pas super pour la lisibilite du code.

  3. #3
    Membre expérimenté Avatar de herve91
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 282
    Points : 1 608
    Points
    1 608
    Par défaut
    Effectivement, la spec est claire sur ce point :
    The built-in integer operators do not indicate (positive or negative) overflow in any way; they wrap around on overflow. The only integer operators that can throw an exception are the integer divide and integer remainder operators, which can throw an ArithmeticException if the right-hand operand is zero.
    Je pense que c'est avant tout pour des soucis de performance.
    Maintenant, si nécessaire, il est possible de gérer à la main la gestion de l'overflow, si celle-ci a une forte chance de se produire. En clair, il faut maitriser les calculs que l'on fait éventuellement faire des assertions sur les valeurs d'entrée avant le calcul pour être sûr que ces dernières sont bien à l'intérieur des plages requises pour le calcul.
    Je ne vois pas comment il pourair gerer le overflow.
    A l'aide d'un indicateur de débordement ? c'est classiquement le cas lors d'opérations arithmétiques sur des processeurs physiques.

  4. #4
    Expert éminent sénior
    Avatar de Baptiste Wicht
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    7 431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Suisse

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

    Informations forums :
    Inscription : Octobre 2005
    Messages : 7 431
    Points : 21 324
    Points
    21 324
    Par défaut
    Citation Envoyé par openWorld Voir le message
    Je ne vois pas comment il pourair gerer le overflow.
    Lancer une exception a chaque operation numerique. Pas super pour la lisibilite du code.
    Il suffit de lancer des exceptions non controlées de la même manière que c'est fait avec NullPointerException non ?

  5. #5
    Membre expérimenté Avatar de herve91
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 282
    Points : 1 608
    Points
    1 608
    Par défaut
    Citation Envoyé par Baptiste Wicht Voir le message
    Il suffit de lancer des exceptions non controlées de la même manière que c'est fait avec NullPointerException non ?
    Il suffirait en effet

  6. #6
    Expert éminent sénior
    Avatar de Baptiste Wicht
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    7 431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Suisse

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

    Informations forums :
    Inscription : Octobre 2005
    Messages : 7 431
    Points : 21 324
    Points
    21 324
    Par défaut
    Citation Envoyé par herve91 Voir le message
    Il suffirait en effet
    Bon, c'est clair que c'est plus facile à dire qu'à faire.

    C'est vrai que s'il fallait contrôler chaque opération mathématique, ça pourrait pourrir les performances...

    Mais dans le projet que j'avais vu, ça ne cassait pas trop les performances du programme.

  7. #7
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    Enfin si tu touches à des nombres aussi grands mieux vaudrait employer BigInteger
    Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Février 2007
    Messages
    190
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 190
    Points : 153
    Points
    153
    Par défaut
    Quel est le projet que tu as vu?

    Comment faisait-il?

  9. #9
    Expert éminent sénior
    Avatar de Baptiste Wicht
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    7 431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Suisse

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

    Informations forums :
    Inscription : Octobre 2005
    Messages : 7 431
    Points : 21 324
    Points
    21 324
    Par défaut
    Citation Envoyé par LGnord Voir le message
    Quel est le projet que tu as vu?

    Comment faisait-il?
    C'était le projet de Bachelor de deux étudiants.

    En fait, ils modifiaient le bytecode de l'application à tester pour rajouter des instructions de tests et envoyer chaque overflow vers un fichier ou une base de données.

    Par contre, ça augmentait pas mal la taille du .jar alors ils avait une deuxième méthode avec l'inlining pour que la taille soit plus petite, mais les performances étaient bien moindres.

    Mais les perfs et la taille n'ont que peu d'importance, l'application étant surtout destinée à tourner durant le développement et pas en production.

  10. #10
    Membre émérite
    Avatar de mavina
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2004
    Messages
    1 812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1 812
    Points : 2 411
    Points
    2 411
    Par défaut
    Le problème est que si tu fais une exception du genre NullPointerException (donc une RuntimeException qui arrette ton programme), dès que tu as un overflow quelconque (ca arrive vite avec des multiplications d'entier) sur un nombre, c'est la misère à gérer, tu ne pense pas ?
    Imagine une calculatrice, il faudrait tout faire avec des BigInteger tout simplement parceque tu ne peux pas prévoire ce que l'utilisateur va rentrer et que tu risques d'avoir une exception si une multiplication trop grande est rentrée...

    Donc on en arriverai à l'inutilité du primitif int et BigInteger lui sera préféré dans un grand nombre de cas, ce qui ne simplifierai pas la lisibilité des codes.

    F.
    Développeur Java / Flex à Shanghai, Chine
    mes publications
    Mon dernier tutoriel : Messages Quit IRC : explications

    La rubrique IRC recrute des redacteurs : contactez moi

    Ce flim n'est pas un flim sur le cyclimse. Merci de votre compréhension.[/SIZE]

  11. #11
    Expert éminent sénior
    Avatar de Baptiste Wicht
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    7 431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Suisse

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

    Informations forums :
    Inscription : Octobre 2005
    Messages : 7 431
    Points : 21 324
    Points
    21 324
    Par défaut
    Citation Envoyé par mavina Voir le message
    Le problème est que si tu fais une exception du genre NullPointerException (donc une RuntimeException qui arrette ton programme), dès que tu as un overflow quelconque (ca arrive vite avec des multiplications d'entier) sur un nombre, c'est la misère à gérer, tu ne pense pas ?
    Imagine une calculatrice, il faudrait tout faire avec des BigInteger tout simplement parceque tu ne peux pas prévoire ce que l'utilisateur va rentrer et que tu risques d'avoir une exception si une multiplication trop grande est rentrée...

    Donc on en arriverai à l'inutilité du primitif int et BigInteger lui sera préféré dans un grand nombre de cas, ce qui ne simplifierai pas la lisibilité des codes.

    F.
    Personnellement, je préfère avoir une calculatrice qui plante plutôt qu'une calculatrice qui m'affiche une valeur fausse...

    Pour une calculatrice, c'est différent, ils n'ont pas le droit à l'erreur. En plus,tu peux tout à fait limiter ce que l'utilisateur va entrer.

    De plus, tu compares avec une NullPointerException, mais est-ce qu'on les catche ? Non

    Je pense qu'on ne devrait pas avoir d'overflow dans un programme, c'est une source d'erreur difficile à tracer. Donc, oui, je préférerais que mon programme plante à chaque overflow comme il plante à chaque pointeur null sur lequel on invoque une méthode.

  12. #12
    Membre émérite
    Avatar de mavina
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2004
    Messages
    1 812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1 812
    Points : 2 411
    Points
    2 411
    Par défaut
    C'est un choix de conception qu'a fait Sun vis à vis des overflows.
    Si tu dois catcher une exception à chaque opération sur un int, t'as pas fini...

    plus, tu compares avec une NullPointerException, mais est-ce qu'on les catche ? Non
    A la base c'est toi qui as cité le NullPointerException :
    Il suffit de lancer des exceptions non controlées de la même manière que c'est fait avec NullPointerException non ?
    Non on ne les catch pas, c'est une RuntimeException, ce qui veut dire que lorsqu'elle est déclanchée, java considère que ton programme ne peut continuer à tourner normalement, et il s'arrette.
    Si tu fais pareil avec un overflow numérique, on est vite embetté.
    Je ne dis pas que c'est une bonne solution qu'ils ont choisie, mais serait-il vraiment mieux d'arretter le programme pour un overflow numérque ?

    Je n'en suis pas si sûr...

    F.
    Développeur Java / Flex à Shanghai, Chine
    mes publications
    Mon dernier tutoriel : Messages Quit IRC : explications

    La rubrique IRC recrute des redacteurs : contactez moi

    Ce flim n'est pas un flim sur le cyclimse. Merci de votre compréhension.[/SIZE]

  13. #13
    Expert éminent sénior
    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
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par mavina Voir le message
    Si tu dois catcher une exception à chaque opération sur un int, t'as pas fini...
    Justement non : en utilisant des RuntimeException on n'est pas obligé de les catcher. D'ailleurs tu ne traites pas les ArithmeticExceptions qui peuvent pourtant être propagés...


    Il y aurait un grand intérêt à cela, c'est d'avoir un code "fail-fast", c'est à dire qui plante rapidement.

    Dans la plupart des cas, lorsqu'un overflow numérique survient, cela entraine de gros dysfonctionnement de l'application, dont il n'est pas forcément évident de trouver la source (puisque le calcul erroné a pu être effectué bien avant le moment où cela posera problème).

    En remontant une exception dès l'overflow on obtient rapidement la cause exacte de l'erreur !



    Comme tu le dis en cas d'overflow il vaut mieux arrêter le programme, donc une exception serait la bienvenue...



    Maintenant j'ignore la raison exacte qui fait qu'il n'y a pas d'exception sur les overflow numérique... peut être que cela se révèle trop couteux en terme de performance...




    Une JVM de test qui ferait cela pourrait en effet être utile pour le développement et les tests... quoique dans la pratique les overflow se produise surtout en prod

    a++

  14. #14
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 116
    Points : 120
    Points
    120
    Par défaut
    faut deja faire une application balaise qui depasse la valeur d'un long Autant dire qu'il y a uniquement à l'ESA(et autres variantes nationales) qu'ils ont besoin verifier les owerflow. ET Encore.
    Je me trompe?
    2^64 imaginez un peu ya de quoi compter tout les micrometre d'ici aud ela de la grande ourse

  15. #15
    Membre émérite
    Avatar de mavina
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2004
    Messages
    1 812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1 812
    Points : 2 411
    Points
    2 411
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    ...
    Je suis en partie d'accord avec toi, mais dépasser une capacité et faire une division par zéro sont deux choses différentes.

    Diviser par zéro est une chose impossible, aller au delà de 2^32 l'est. Donc aller au dela de 2^32 n'est pas exceptionnel, donc il n'y a pas lieu d'avoir une exception.

    Je comprend que le fait d'avoir un code fail fast soit interessant, mais on va vite vers de l'assistanat (et java a déjà une mauvaise réputation à ce propos ). Si tu sais que tu risques un dépassement de capacité en int, tu pars sur du long ou sur du big integer plutot que de partir sur du int.

    Comme tu le dis, qui dit vérification dit perte de performances. M'est avis qu'ils ont du tester et vite abandonner l'idée, ca a du plomber les bench

    F.
    Développeur Java / Flex à Shanghai, Chine
    mes publications
    Mon dernier tutoriel : Messages Quit IRC : explications

    La rubrique IRC recrute des redacteurs : contactez moi

    Ce flim n'est pas un flim sur le cyclimse. Merci de votre compréhension.[/SIZE]

  16. #16
    Expert éminent sénior
    Avatar de Baptiste Wicht
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    7 431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Suisse

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

    Informations forums :
    Inscription : Octobre 2005
    Messages : 7 431
    Points : 21 324
    Points
    21 324
    Par défaut
    Citation Envoyé par openWorld Voir le message
    faut deja faire une application balaise qui depasse la valeur d'un long Autant dire qu'il y a uniquement à l'ESA(et autres variantes nationales) qu'ils ont besoin verifier les owerflow. ET Encore.
    Je me trompe?
    2^64 imaginez un peu ya de quoi compter tout les micrometre d'ici aud ela de la grande ourse
    Un long peut-être, mais un int (2 147 483 648), c'est pas si grand que ça...

    Tu prends déja le nombre de pixels d'un écran en 2560*1600 et tu arrives à plus de deux fois ce résultat.

  17. #17
    Membre expert
    Avatar de natha
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 346
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 346
    Points : 3 083
    Points
    3 083
    Par défaut
    Citation Envoyé par Baptiste Wicht Voir le message
    Tu prends déja le nombre de pixels d'un écran en 2560*1600 et tu arrives à plus de deux fois ce résultat.
    Ouahhh c'est la classe ton écran ! J'aimerais bien avoir autant !
    Comment ça ? La réponse à ton problème n'est ni dans la faq, ni dans les tutos, ni dans sources ??? Etonnant...
    De la bonne manière de poser une question (et de répondre).
    Je ne fais pas de service par MP. Merci (...de lire les règles...).
    Ma page dvp.com

  18. #18
    Expert éminent sénior
    Avatar de Baptiste Wicht
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    7 431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Suisse

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

    Informations forums :
    Inscription : Octobre 2005
    Messages : 7 431
    Points : 21 324
    Points
    21 324
    Par défaut
    Citation Envoyé par natha Voir le message
    Ouahhh c'est la classe ton écran ! J'aimerais bien avoir autant !
    C'est pas le mien malheureusement J'en suis encore à 1280*1024, mais par contre, j'en ai 2

  19. #19
    Membre émérite
    Avatar de mavina
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2004
    Messages
    1 812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1 812
    Points : 2 411
    Points
    2 411
    Par défaut
    Citation Envoyé par Baptiste Wicht Voir le message
    Tu prends déja le nombre de pixels d'un écran en 2560*1600 et tu arrives à plus de deux fois ce résultat.
    Alors dans ces cas là tu réfléchis et tu codes avec des long et pas avec des int nan ?

    Enfin je dis ça moi je dis rien, tu cherche un peu à nous montrer que java ne te signale pas des erreurs que visiblement tu peux prévoire et dont tu peux te passer facilement

    F.
    Développeur Java / Flex à Shanghai, Chine
    mes publications
    Mon dernier tutoriel : Messages Quit IRC : explications

    La rubrique IRC recrute des redacteurs : contactez moi

    Ce flim n'est pas un flim sur le cyclimse. Merci de votre compréhension.[/SIZE]

  20. #20
    Expert éminent sénior
    Avatar de Baptiste Wicht
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    7 431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Suisse

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

    Informations forums :
    Inscription : Octobre 2005
    Messages : 7 431
    Points : 21 324
    Points
    21 324
    Par défaut
    Citation Envoyé par mavina Voir le message
    Alors dans ces cas là tu réfléchis et tu codes avec des long et pas avec des int nan ?

    Enfin je dis ça moi je dis rien, tu cherche un peu à nous montrer que java ne te signale pas des erreurs que visiblement tu peux prévoire et dont tu peux te passer facilement

    F.
    Bien sûr que ce cas-là, tu peux prévoir

    Je cherche juste à montrer que c'est très vite fait avec une multiplication de sortir des limites...

    N'empêche que même pour le coup de l'écran, le débutant qui calcule ça, je suis sûr qu'il ne comprendra pas pourquoi ça lui donne des nombres impossibles quand il passe sur des gros écrans.

Discussions similaires

  1. Pourquoi pas de Java dans les JSP
    Par Kurogane dans le forum Servlets/JSP
    Réponses: 7
    Dernier message: 09/10/2013, 17h17
  2. Réponses: 2
    Dernier message: 16/06/2006, 15h09
  3. Applet java qui ne marche pas sous opéra, pourquoi ?
    Par WeDgEMasTeR dans le forum Applets
    Réponses: 2
    Dernier message: 17/05/2006, 00h23

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