Question

double d=1/0.0;
    System.out.println(d);

Il imprime Infinity, mais si nous écrivons double d=1/0; et l'imprimons, nous obtiendrons cette exception: Exception in thread "main" java.lang.ArithmeticException: / by zero at D.main(D.java:3) Pourquoi Java sait-il dans un cas que plonger par zéro est l'infini mais que pour le int 0, il n'est pas défini? Dans les deux cas, d est double et dans les deux cas le résultat est l'infini.

Était-ce utile?

La solution

Les types de données à virgule flottante ont une valeur spéciale réservée pour représenter l'infini, contrairement aux valeurs entières.

Dans votre code, 1/0 est une division entière qui, bien sûr, échoue.Cependant, 1/0.0 est une division en virgule flottante et résulte donc en Infinity.

Autres conseils

À proprement parler, 1.0/0.0 n'est pas du tout l'infini, il n'est pas défini.

Comme le dit David dans sa réponse, les flotteurs ont une façon d'exprimer un nombre qui n'est pas dans la plage du nombre le plus élevé qu'il peut représenter et le plus bas. Ces valeurs sont collectivement appelées "Pas un nombre" ou simplement NaN. Les NaN peuvent également provenir de calculs qui sont vraiment infinis (tels que limx -> 0 ln2 x), des valeurs qui sont finies mais qui dépassent la plage que les flottants peuvent représenter (comme 10 100 100 ), ainsi sous forme de valeurs non définies telles que 1/0.

Les nombres à virgule flottante ne distinguent pas clairement les valeurs non définies, le débordement et l'infini; quelle combinaison de bits résulte de ce calcul dépend. Comme il est un peu plus difficile à comprendre pour les gens qui ne savent pas comment les valeurs en virgule flottante sont représentées, le formateur imprime simplement "Infinity" ou parfois "-Infinity" Puisqu'il fournit la même chose niveau d'information lorsque vous savez ce que sont les FP NaN, et a une certaine signification lorsque vous ne le faites pas.

Les nombres entiers n'ont rien de comparable aux NaN à virgule flottante. Puisqu'il n'y a pas de valeur raisonnable pour un entier à prendre lorsque vous faites 1/0, la seule option qui reste est de lever une exception.

Le même code écrit en langage machine peut soit invoquer une interruption, ce qui est comparable à une exception Java, soit définir un registre de conditions, qui serait une valeur globale pour indiquer que le dernier calcul était une division par zéro. lequel de ceux qui sont disponibles varie un peu selon la plate-forme.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top