Warum integer-division durch null-1/0 Fehler geben, aber floating-point-1/0.0 gibt "Inf"?
Ich bin nur neugierig über diese:
Bei der Bewertung 1/0
in Java, tritt die folgende Ausnahme:
Exception in thread "main"
java.lang.ArithmeticException: /by
null
an Foo.main(Foo.java:3)
Aber 1/0.0
ausgewertet, um zu Infinity
.
public class Foo {
public static void main (String[] args) {
System.out.println(1/0.0);
}
}
Warum geschieht dies?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das ist, weil die ganzen zahlen nicht die Werte für +/-Inf, NaN, und erlauben nicht, dass die division durch 0, während die Schwimmer haben diese besonderen Werte.
1/0 eine division von zwei ints, und wirft eine Ausnahme, weil Sie nicht teilen kann durch die ganze Zahl null. Aber 0.0 ist ein literal vom Typ Doppel -, und Java verwenden einer floating-point-division. Das IEEE-floating-point-Spezifikation hat spezielle Werte für die Division durch null (unter anderen Sache), eine davon ist doppelt.Infinity.
Wenn Sie an details interessiert, die floating-point-spec (die oft kryptischen) hat eine Seite bei Wikipedia: http://en.wikipedia.org/wiki/IEEE_754-2008, und Ihrer vollständigen text können Sie auch online Lesen: http://ieeexplore.ieee.org/xpl/mostRecentIssue.jsp?punumber=4610933.
1/0 ist Ganzzahl-division, 1/0.0 floating point division - Schwimmer darstellen können ungültige Werte, ganze zahlen nicht.
IEEE definiert hat bestimmte standards für die floating-point-zahlen, die zählen Definitionen für "not a Number" und positive und negative Unendlichkeit. Diese gelten nicht für ganze zahlen.
Sehen http://steve.hollasch.net/cgindex/coding/ieeefloat.html
Den Grund für diesen besonderen Fällen in der im Grunde Rundungsfehler. Floating point zahlen sind oft immer abgeschnitten, weil Sie nie genau. Ganzzahlen sind, auf der anderen Seite, sind immer genau.
fetestexcept
undfeenableexcept
Es ist erwähnenswert, dass die zugrunde liegende CPU-hardware erkennen kann, die den speziellen Fall der
0.0 /0.0
, und:fetestexcept(FE_ALL_EXCEPT) == FE_INVALID
feenableexcept(FE_INVALID)
glibc-ErweiterungKonnte ich nicht finden, wenn Java stellt diese Funktionalität allerdings.
Hier ist ein minimaler ausführbarer C Beispiel: Was ist der Unterschied zwischen quiet NaN und signaling NaN?