Vous aimez ce que vous lisez sur ce blog ?
Envie d'aller plus loin avec véritable formation d'expertise en Java ?
Venez suivre ma formation Masterclasse Expertise Java !

"Même un développeur experimenté a besoin de continuer à apprendre. Et dans cette formation... j'ai appris beaucoup !" - A.G., Java Champion

Sessions intra-entreprises sur demande : contact[at]mokatech.net.
Inscrivez-vous vite !

Java Quiz #2

Trouvez X tel que :

  1. Math.abs(X) < 0

Réponse :

  1. int X = Integer.MIN_VALUE;

En java, les entiers sont représentés sur 32 bits, ce qui permet de représenter un nombre pair de valeurs possibles (2^32), à répartir entre les valeurs positives et les valeurs négatives : 2^31 valeurs pour chaque signe.

Mais que faire de la valeur zéro, situé "au milieu" ?
Le zéro est considéré comme étant "positif" ; en conséquence, il n'est plus possible de représenter que (2^31)-1 valeurs strictement positives, alors qu'on peut toujours représenter (2^31) valeurs strictement négatives.

Revenons à notre problème.
A la lumière de l'explication ci-dessus, nous comprenons que la plus petite valeur négative, -(2^31) n'a pas d'équivalent positif, puisque +(2^31) n'est pas représentable avec un int. La fonction Math.abs() se retrouve donc devant un problème délicat.

La javadoc de Math.abs() nous apprend ceci :

Note that if the argument is equal to the value of Integer.MIN_VALUE, the most negative representable int value, the result is that same value, which is negative.

Nous obtenons donc :

  1. int X = Integer.MIN_VALUE;
  2. int result = Math.abs(X);
  3. if (result < 0) {
  4. System.out.println("La valeur absolue est négative");
  5. }

Conclusion : toujours lire la javadoc !


Commentaires

1. Le dimanche 2 mars 2008, 20:26 par olive

marrant. Encore une bonne leçon de Java

2. Le jeudi 6 mars 2008, 13:59 par Noël

Petite remarque. Quand on lit la doc Java on remarque aussi que quand on est plus avec des int, le problème ne se pose plus : il existe un zéro positif et un zéro négatif.

Autre remarque. En C, la bibliothèque math.h inclut bien une méthode fabs pour les float, mais omet de fournir une méthode pour les int ;)

3. Le vendredi 16 mai 2008, 13:47 par Didier
Voici un petit retour du monde Microsoft. En C# la traduction de ce programme Java est la suivante :
1 int X = int.MinValue;
2 int result = Math.Abs(X);
3 if (result < 0) 
4 {
5 	System.Console.WriteLine("La valeur absolue est négative");
6 }
Le résultat est une exception à la ligne 2 :
"Negating the minimum value of a twos complement number is invalid."
La gestion de ce problème particulier est très différente et évite de se poser des question sur le pourquoi d'un possible bug induit par ce code.
4. Le dimanche 10 juillet 2011, 20:39 par Khamamouch

Notons que cela est aussi valable pour Long.MIN_VALUE.

Je me fais l'intégralité des puzzle, j'aime bien plus que le sudoku :p, merci Olivier !

Ajouter un commentaire

Le code HTML est affiché comme du texte et les adresses web sont automatiquement transformées.