La déclaration suivante lance java.lang.ArithmeticException: / by zero
comme une évidence.
System.out.println(0/0);
parce que le littéral 0
est considéré comme un int
et la division par zéro n'est pas autorisée dans l'arithmétique des nombres entiers.
Toutefois, le cas suivant n'a pas lancer toute exception comme java.lang.ArithmeticException: / by zero
.
int a = 0;
double b = 6.199;
System.out.println((b/a));
Il affiche Infinity
.
L'instruction suivante produit NaN
(Not a Number) sans exception.
System.out.println(0D/0); //or 0.0/0, or 0.0/0.0 or 0/0.0 - floating point arithmetic.
Dans ce cas, les deux opérandes sont considérés comme des doubles.
De même, les déclarations suivantes Ne le fais pas. lancer une exception.
double div1 = 0D/0; //or 0D/0D
double div2 = 0/0D; //or 0D/0D
System.out.printf("div1 = %s : div2 = %s%n", div1, div2);
System.out.printf("div1 == div2 : %b%n", div1 == div2);
System.out.printf("div1 == div1 : %b%n", div1 == div1);
System.out.printf("div2 == div2 : %b%n", div2 == div2);
System.out.printf("Double.NaN == Double.NaN : %b%n", Double.NaN == Double.NaN);
System.out.printf("Float.NaN == Float.NaN : %b%n", Float.NaN == Float.NaN);
Ils produisent le résultat suivant.
div1 = NaN : div2 = NaN
div1 == div2 : false
div1 == div1 : false
div2 == div2 : false
Double.NaN == Double.NaN : false
Float.NaN == Float.NaN : false
Ils reviennent tous false.
Pourquoi cette opération (division par zéro) est-elle autorisée avec des nombres en virgule flottante ou en double précision ?
Par ailleurs, je peux comprendre que les nombres à virgule flottante (nombres à double précision) ont leurs valeurs qui représentent infinité positive , infinité négative , pas un numéro ( NaN
)...
0 votes
Dans le premier cas, puisque vous utilisez un int, la promotion pourrait donner quelque chose comme 0,00 001, ou quelque chose de proche de Double.MIN_VALUE, qui donnerait un nombre énorme si vous divisez n'importe quoi par lui.
4 votes
@Tiny : Retournez votre question : pourquoi
1/0
lancer une exception au lieu de retournerInfinity
? La réponse est qu'un entier complémentaire à deux (ce qui est le cas de l'entier de Java) n'est pas un nombre entier.int
est) n'a pas de bits disponibles pour stocker des valeurs spéciales telles queInfinity
oNaN
Le résultat n'étant pas représentable dans le type souhaité, une exception doit être levée. Les nombres à virgule flottante n'ont pas ce problème (il existe un modèle de bit disponible pour les nombres à virgule flottante).Infinity
), et donc aucune exception n'est nécessaire.