Warum haben Doppel -0
so gut wie +0
? Was ist der Hintergrund und die Bedeutung?
java
floating-point
zero
Ken Russell
quelle
quelle
-0.0
.Antworten:
-0
wird (allgemein) als0
****** behandelt . Dies kann der Fall sein, wenn eine negative Gleitkommazahl so nahe bei Null liegt, dass sie berücksichtigt werden kann0
(um klar zu sein, ich beziehe mich auf einen arithmetischen Unterlauf , und die Ergebnisse der folgenden Berechnungen werden als genau±0
und nicht nur als sehr klein interpretiert Zahlen). z.BSystem.out.println(-1 / Float.POSITIVE_INFINITY);
Wenn wir den gleichen Fall mit einer positiven Zahl betrachten, erhalten wir unser gutes altes
0
:System.out.println(1 / Float.POSITIVE_INFINITY);
******* Hier ist ein Fall, in dem die Verwendung
-0.0
zu etwas anderem führt als bei der Verwendung0.0
:System.out.println(1 / 0.0); System.out.println(1 / -0.0);
Dies ist sinnvoll, wenn wir die Funktion betrachten
1 / x
. Wenn wir uns von der Seitex
nähern , sollten wir eine positive Unendlichkeit bekommen, aber wenn wir uns von der Seite nähern , sollten wir eine negative Unendlichkeit bekommen. Das Diagramm der Funktion sollte dies klarstellen:0
+
-
( Quelle )
In mathematischen Begriffen:
Dies zeigt einen signifikanten Unterschied zwischen
0
und-0
im rechnerischen Sinne.Hier sind einige relevante Ressourcen, von denen einige bereits angesprochen wurden. Der Vollständigkeit halber habe ich sie aufgenommen:
quelle
1/(x - a)
korrekt berechnet werden .x
a
3 +/- epsilon
. Diesepsilon
würde Sie auf eine Seite der Asymptote bringen (abhängig davon, ob Sie sie addieren oder subtrahieren).Aus Wikipedia
Wenn Sie einen haben Gleitpunktoperation , die ein Ergebnis erzeugt , das eine ist negativ Fließkommazahl nahe Null , aber das kann nicht dargestellt werden (bei der Berechnung) ist es ein „-0,0“ produzieren. Zum Beispiel -
5.0 / Float.POSITIVE_INFINITY -> -0.0
.Diese Unterscheidung in
-0.0
und+0.0
gibt Ihnen mehr Informationen als nur ein Endergebnis 0. Natürlich existiert dieses Konzept "nur" in einem endlichen Repräsentationssystem, wie es in Computern verwendet wird. In der Mathematik können Sie eine beliebige Zahl darstellen, auch wenn sie sehr nahe bei Null liegt.−0
und+0
resultieren aus Operationen, die Unterläufe verursachen , ähnlich−00
oder+00
resultieren aus Operationen, die einen Überlauf verursachen . Für die Operationen, die eine mathematische Unbestimmtheit verursachen, ist das Ergebnis in NaN (z. B. 0/0).Was ist der Unterschied zwischen -0,0 und 0,0?
In Wirklichkeit stellen beide 0 dar. Außerdem gibt (-0,0 == 0,0) true zurück . Dennoch:
1)
1/-0.0
erzeugt -Infinity, während Infinity1/0.0
erzeugt wird .2)
3 * (+0)
= +0 und+0/-3
= -0 . Die Vorzeichenregeln gelten, wenn Multiplikationen oder Divisionen über eine vorzeichenbehaftete Null durchgeführt werden.Obligatorische Lektüre " Was jeder Informatiker über Gleitkomma-Arithmetik wissen sollte " (in den Kommentaren vorschlagen).
quelle
Siehe den Abschnitt "Signed Zero" in Was jeder Informatiker über Gleitkomma-Arithmetik wissen sollte
Nullen in Java float und double repräsentieren nicht nur die wahre Null. Sie werden auch als Ergebnis für jede Berechnung verwendet, deren genaues Ergebnis eine zu kleine Größe hat, um dargestellt zu werden. In vielen Zusammenhängen gibt es einen großen Unterschied zwischen dem Unterlauf einer negativen Zahl und dem Unterlauf einer positiven Zahl. Wenn zum Beispiel
x
eine positive Zahl von sehr kleiner Größe ist,1/x
sollte sie positiv unendlich und1/(-x)
negativ unendlich sein. Die vorzeichenbehaftete Null bewahrt das Vorzeichen der Unterlaufergebnisse.quelle
Die kanonische Referenz für die Nützlichkeit von vorzeichenbehafteten Nullen im Gleitkomma ist Kahans Artikel " Verzweigungsschnitte für komplexe Elementarfunktionen oder viel Lärm um das Vorzeichenbit von Nothing " (und einige seiner Vorträge zu diesem Thema).
Die Kurzversion ist, dass in vernünftigerweise üblichen technischen Anwendungen die Vorzeicheninformationen, die durch das Vorzeichen Null erhalten bleiben, erforderlich sind, um korrekte Lösungen aus numerischen Methoden zu erhalten. Das Vorzeichen von Null hat für die meisten realen Operationen wenig Bedeutung , aber wenn komplexwertige Funktionen berücksichtigt oder konforme Zuordnungen verwendet werden, kann das Vorzeichen von Null plötzlich ziemlich kritisch werden.
Es ist auch erwähnenswert, dass das ursprüngliche
IEEE-754
Komitee (1985) einen projektiven Modus für Gleitkommaoperationen in Betracht gezogen und abgelehnt hat , bei dem es nur eine einzige vorzeichenlose Unendlichkeit geben würde (+/- 0 wäre in einem solchen Modus semantisch identisch). Selbst wenn es noch zwei Codierungen gäbe, gäbe es auch nur eine einzige Null.quelle