Warum haben Gleitkommazahlen vorzeichenbehaftete Nullen?

75

Warum haben Doppel -0so gut wie +0? Was ist der Hintergrund und die Bedeutung?

Ken Russell
quelle
2
Lesen Sie alles darüber auf Wikipedia : "Vorzeichenlose Null ist Null mit einem zugehörigen Vorzeichen. In der gewöhnlichen Arithmetik ist −0 = +0 = 0. Bei der Berechnung lassen jedoch einige Zahlendarstellungen die Existenz von zwei Nullen zu, die häufig mit −0 bezeichnet werden (negative Null) und +0 (positive Null). Dies tritt in den Vorzeichen- und Größen- und Einsen-Komplement-Vorzeichenzahldarstellungen für Ganzzahlen und in den meisten Gleitkommazahlendarstellungen auf. Die Zahl 0 wird normalerweise als +0 codiert, kann aber sein dargestellt durch entweder +0 oder -0. "
Marko Topolnik
2
@ GregHewgill Ich glaube nicht, dass es sich um ein Duplikat handelt. Diese Frage fragt warum, der Link fragt, ob die Bitmuster legitim sind und als verwendet werden -0.0.
Daniel Fischer
11
Die vorzeichenbehaftete Null ist nicht Java-spezifisch.
Phkahler
1
Das ist eine wirklich gute Frage. Jetzt müssen wir nur noch auf einige ebenso gute Antworten warten.
David Heffernan

Antworten:

87

-0wird (allgemein) als 0****** behandelt . Dies kann der Fall sein, wenn eine negative Gleitkommazahl so nahe bei Null liegt, dass sie berücksichtigt werden kann 0(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.B

System.out.println(-1 / Float.POSITIVE_INFINITY);
-0,0

Wenn wir den gleichen Fall mit einer positiven Zahl betrachten, erhalten wir unser gutes altes 0:

System.out.println(1 / Float.POSITIVE_INFINITY);
0.0

******* Hier ist ein Fall, in dem die Verwendung -0.0zu etwas anderem führt als bei der Verwendung 0.0:

System.out.println(1 / 0.0);
System.out.println(1 / -0.0);
Unendlichkeit
-Unendlichkeit

Dies ist sinnvoll, wenn wir die Funktion betrachten 1 / x. Wenn wir uns von der Seite xnä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:

Geben Sie hier die Bildbeschreibung ein

Geben Sie hier die Bildbeschreibung ein

Dies zeigt einen signifikanten Unterschied zwischen 0und -0im rechnerischen Sinne.


Hier sind einige relevante Ressourcen, von denen einige bereits angesprochen wurden. Der Vollständigkeit halber habe ich sie aufgenommen:

A. RS
quelle
@ARS: Macht in gewisser Weise Sinn. Aber was ist der Nachteil der Gleichsetzung (-1 / Float.POSITIVE_INFINITY) mit +0. Gibt es eine praktische Anwendung für -0?
Ken Russell
3
In diesem Fall sollte es zwei "signierte" Versionen jeder Nummer geben, damit diese auf beiden Seiten 1/(x - a)korrekt berechnet werden . xa
Asmeurer
1
@asmeurer Diese signierte Nummer (in dem Sinne, von dem Sie sprechen) wäre die Nummer +/- ein kleiner Wert, z 3 +/- epsilon. Dies epsilonwürde Sie auf eine Seite der Asymptote bringen (abhängig davon, ob Sie sie addieren oder subtrahieren).
Arshajii
Um es klar auszudrücken: ± 1 / unendlich im Gleitkomma ist genau ± 0, nicht nur eine wirklich winzige Zahl. Gleitkomma-Nullen können durch Unterlauf entstehen, werden jedoch als genau gleich Null interpretiert.
Stephen Canon
@asmeurer: Ich denke nicht, dass zwei signierte Versionen von endlichen Zahlen ungleich Null irgendetwas helfen würden. Es würde helfen, Infinitesimale zusammen mit einer wahren Null und Infinitesimalzeichen ohne Vorzeichen zu haben: 1 / + INF wäre + TINY; 1 / -INF wäre -TINY; (+ TINY) + (- TINY) wäre? INF.; ? INF + + INF wäre auch? INF und 1/0 und 1 /? INF wäre NAN. Ich denke jedoch nicht, dass es die Hardwarekosten wert wäre.
Supercat
29

Aus Wikipedia

Vorzeichen Null ist Null mit einem zugehörigen Vorzeichen. In gewöhnlicher Arithmetik −0 = +0 = 0. Beim Rechnen existiert das Konzept der Existenz von zwei Nullen in einigen Zahlendarstellungen , die normalerweise mit −0 und '+0' bezeichnet werden und eine negative Null bzw. eine +0 positive Null darstellen ( Quelle ).

Dies geschieht in dem Vorzeichen und die Größe und Ergänzung Einsen unterzeichnet Zahlendarstellungen für ganze Zahlen sind , und in den meisten Gleitkommazahl Darstellungen. Die Zahl 0 wird normalerweise als +0 codiert, kann aber entweder durch +0 oder –0 dargestellt werden.

Nach dem IEEE 754 standardnegative Null und positive Null sollten als gleich vergleichen mit den üblichen (numerischen) Vergleichsoperator, wie die == Betreiber von C und Java. ( Quelle ).

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.0und +0.0gibt 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.

−0und +0resultieren aus Operationen, die Unterläufe verursachen , ähnlich −00oder +00resultieren 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.0erzeugt -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).

Traumcrash
quelle
3
Die Metadiskussion ist hierher gezogen .
Robert Harvey
25

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 xeine positive Zahl von sehr kleiner Größe ist, 1/xsollte sie positiv unendlich und 1/(-x)negativ unendlich sein. Die vorzeichenbehaftete Null bewahrt das Vorzeichen der Unterlaufergebnisse.

Patricia Shanahan
quelle
8

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-754Komitee (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.

Stephen Canon
quelle
1
@dreamcrash: Meiner Meinung nach wäre der "richtige" Ansatz numerisch, wenn die Hardwarekosten nicht berücksichtigt würden, eine echte Null, ein vorzeichenloses Infinitesimal, ein positives Infinitesimal und ein negatives Infinitesimal. Das Hinzufügen von Nicht-Null-Zahlen mit entgegengesetztem Vorzeichen und gleicher Größe würde ein vorzeichenloses Infinitesimal ergeben; während Multiplikationen oder Divisionen, die unterlaufen, ein geeignet signiertes Infinitesimal ergeben würden. Die einzigen primitiven Operationen, die "wahre Null" ergeben würden, wären die Addition von wahrer Null zu wahrer Null, die Multiplikation mit wahrer Null oder die Division von wahrer Null durch etwas Vorzeichen.
Supercat