Ich bin verwirrt darüber, warum uns unterschiedliche Darstellungen für positive und negative Nullen wichtig sind.
Ich erinnere mich vage an die Behauptungen, dass eine negative Nullrepräsentation bei der Programmierung mit komplexen Zahlen extrem wichtig ist. Ich hatte noch nie die Möglichkeit, Code mit komplexen Zahlen zu schreiben. Deshalb bin ich ein wenig ratlos darüber, warum dies der Fall ist.
Der Wikipedia-Artikel zum Konzept ist nicht besonders hilfreich. es macht nur vage Behauptungen über eine vorzeichenbehaftete Null, was bestimmte mathematische Operationen im Gleitkomma einfacher macht, wenn ich es richtig verstehe. In dieser Antwort werden einige Funktionen aufgelistet, die sich unterschiedlich verhalten. Wenn Sie mit deren Verwendung vertraut sind, können Sie möglicherweise auf die Beispiele zurückgreifen. (Obwohl das spezielle Beispiel der komplexen Quadratwurzeln geradezu falsch aussieht, da die beiden Zahlen mathematisch äquivalent sind, es sei denn, ich habe ein Missverständnis.) Aber ich konnte keine klare Aussage darüber finden, in welche Schwierigkeiten Sie geraten würden, wenn sie nicht da wären. Je mehr mathematische Ressourcen ich finden konnte, umso mehr konnte ich feststellen, dass es aus mathematischer Sicht keine Unterscheidung zwischen beiden gibt, und der Wikipedia-Artikel legt den Schluss nahe, dass dies außerhalb des Rechnens, abgesehen von der Beschreibung von Grenzen, nur selten vorkommt.
Warum ist eine negative Null beim Rechnen wertvoll? Ich bin sicher, ich vermisse nur etwas.
quelle
sqrt(-1+0i) = i
undsqrt(-1-0i) = -i
, obwohl es für einige Programmiersprachen die richtige Syntax hat, glaube ich. Ich werde bearbeiten, um es klarer zu machen.Antworten:
Beachten Sie, dass in der FPU-Arithmetik 0 nicht unbedingt Null bedeuten muss, sondern auch einen zu kleinen Wert, um mit einem bestimmten Datentyp dargestellt zu werden, z
a ist zu klein, um durch float (32 Bit) korrekt dargestellt zu werden, daher wird es auf -0 "gerundet".
Angenommen, unsere Berechnung wird fortgesetzt:
Da a float ist, führt dies zu -infinity, was weit von der korrekten Antwort von -10000000000000000.0 entfernt ist
Nun berechnen wir b, wenn es keine -0 gibt (also wird a auf +0 gerundet):
Das Ergebnis ist wieder falsch wegen der Rundung, aber jetzt ist es "falscher" - nicht nur numerisch, sondern vor allem wegen des unterschiedlichen Vorzeichens (Ergebnis der Berechnung ist + unendlich, korrektes Ergebnis ist -1000000000000000000.0).
Man könnte immer noch sagen, dass es nicht wirklich wichtig ist, da beide falsch sind. Wichtig ist, dass es viele numerische Anwendungen gibt, bei denen das wichtigste Ergebnis der Berechnung das Vorzeichen ist. Wenn Sie beispielsweise mit einem Algorithmus für maschinelles Lernen entscheiden, ob Sie an der Kreuzung nach links oder rechts abbiegen, können Sie einen positiven Wert interpretieren => abbiegen links, negativer Wert => rechts abbiegen, tatsächliche "Größe" des Wertes ist nur "Konfidenzkoeffizient".
quelle
+inf
und-inf
im Normalbetrieb abgehört werden.+inf
und beruhen-inf
. Wenn dein Programm einen Gleitkomma-Unterlauf verursacht, ist das der Fehler und was danach passiert, ist nicht so interessant, imho. Wir vermissen immer noch praktische Beispiele, in denen -0 nützlich ist.Wie erstelle ich eine -0? Es gibt zwei Möglichkeiten: (1) Führen Sie eine Gleitkommaoperation aus, bei der das mathematische Ergebnis negativ ist, aber so nahe an Null liegt, dass es auf Null und nicht auf eine Zahl ungleich Null gerundet wird. Diese Berechnung ergibt eine -0. (b) Bestimmte Operationen mit Nullen: Multiplizieren Sie eine positive Null mit einer negativen Zahl oder dividieren Sie eine positive Null mit einer negativen Zahl oder negieren Sie eine positive Null.
Eine negative Null zu haben, vereinfacht die Multiplikation und Division ein wenig. Das Vorzeichen von x * y oder x / y ist immer das Vorzeichen von x, exclusive oder das Vorzeichen von y. Ohne negative Null müsste eine zusätzliche Prüfung durchgeführt werden, um -0 durch +0 zu ersetzen.
Es gibt einige sehr seltene Situationen, in denen es nützlich ist. Sie können überprüfen, ob das Ergebnis einer Multiplikation oder Division mathematisch größer oder kleiner als Null ist, auch wenn ein Unterlauf vorliegt (sofern Sie wissen, dass das Ergebnis keine mathematische Null ist). Ich kann mich nicht erinnern, jemals Code geschrieben zu haben, bei dem es einen Unterschied macht.
Optimierende Compiler hassen -0. Beispielsweise können Sie x + 0.0 nicht durch x ersetzen, da das Ergebnis nicht x sein sollte, wenn x -0.0 ist. Sie können x * 0.0 nicht durch 0.0 ersetzen, da das Ergebnis -0.0 sein sollte, wenn x <0 ist oder x -0.0 ist.
quelle
-5
und5
hinein gingfmod()
. Es ist ziemlich ärgerlich für meinen Anwendungsfall.C # Double, das IEEE 754 entspricht
druckt:
eigentlich ein wenig zu erklären ...
Dies bedeutet etwas viel näher an d =
The Limit of x as x approaches 0-
oderThe Limit of x as x approaches 0 from the negatives
.Um Philipps Kommentar anzusprechen ...
Grundsätzlich bedeutet negative Null Unterlauf.
Es gibt sehr wenig praktischen Nutzen für eine negative Null, wenn überhaupt ...
Zum Beispiel dieser Code (wieder C #):
ergibt dieses Ergebnis:
Zur informellen Erläuterung: Alle Sonderwerte, die ein Gleitkomma nach IEEE 754 haben kann (positive Unendlichkeit, negative Unendlichkeit, NAN, -0,0), haben im praktischen Sinne keine Bedeutung. Sie können keinen physikalischen Wert oder einen Wert darstellen, der in der Berechnung der "realen Welt" sinnvoll ist. Was sie bedeuten, ist im Grunde das:
sqrt(-7)
, oder es funktioniert nicht eine Grenze , wie hat0/0
oder wiePositiveInfinity/PositiveInfinity
quelle
Die Frage, inwiefern dies mit Berechnungen komplexer Zahlen zusammenhängt, ist der Kern der Frage, warum sowohl +0 als auch -0 im Gleitkomma existieren. Wenn Sie sich mit Komplexanalyse beschäftigen, stellen Sie schnell fest, dass stetige Funktionen von Komplex zu Komplex normalerweise nicht als "einwertig" behandelt werden können, es sei denn, man nimmt die "höfliche Fiktion" an, dass die Ergebnisse eine sogenannte "Riemann-Oberfläche" bilden. Zum Beispiel weist der komplexe Logarithmus jedem Eingang unendlich viele Ausgänge zu; Wenn Sie sie zu einer kontinuierlichen Ausgabe verbinden, werden alle realen Teile um den Ursprung herum zu einer unendlichen Korkenzieheroberfläche. Eine kontinuierliche Kurve, die die reale Achse von der positiv-imaginären Seite nach unten schneidet, und eine weitere Kurve, die sich um den Pol schlängelt und die reale Achse schneidet.
Wenden Sie dies nun auf ein numerisches Programm an, das mit komplexen Gleitkommazahlen berechnet. Die nach einer bestimmten Berechnung ausgeführten Aktionen können sehr unterschiedlich sein, je nachdem, auf welchem Blatt sich das Programm gerade befindet. Das Vorzeichen des zuletzt berechneten Ergebnisses gibt wahrscheinlich Auskunft darüber, auf welchem Blatt sich das Blatt befindet. Angenommen, das Ergebnis war Null? Denken Sie daran, hier bedeutet "Null" wirklich "zu klein, um richtig darzustellen". Wenn die Berechnung jedoch vorsehen könnte, dass das Vorzeichen erhalten bleibt (dh, dass Sie sich merken, welches "Blatt" ist), wenn das Ergebnis Null ist, kann der Code das Vorzeichen überprüfen und auch in dieser Situation die richtige Aktion ausführen.
quelle
Der Grund ist einfacher als üblich
Natürlich gibt es eine Menge Hacks, die sehr gut aussehen und nützlich sind (wie das Runden auf
-0.0
oder+0.0
aber nehmen wir an, wir haben eine Darstellung von signiertem int mit einem Minus / Plus-Zeichen am Anfang (ich weiß, das wird durch U2-Binärcode aufgelöst) in ganzen Zahlen normalerweise aber nehmen Sie eine weniger komplizierte Darstellung von doppelt an):Was ist, wenn es eine negative Zahl gibt?
Okay, so einfach. Stellen wir also 0 dar:
Das ist auch gut so. Aber was ist mit
1 000
? Muss es eine verbotene Nummer sein? Besser nicht.Nehmen wir also an, es gibt zwei Arten von Nullen:
Nun, das wird unsere Berechnungen vereinfachen und zum Glück einige zusätzliche Funktionen abrunden. Das
+0
und-0
kommt also nur von binären Darstellungsproblemen.quelle