fév.
2008
Java Quiz #2
Trouvez X tel que :
Math.abs(X) < 0
Réponse :
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 :
int X = Integer.MIN_VALUE; int result = Math.abs(X); if (result < 0) { System.out.println("La valeur absolue est négative"); }
Conclusion : toujours lire la javadoc !
Commentaires
marrant. Encore une bonne leçon de Java
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 ;)
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.
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 !