Negative Zero

Originally published by Howdy Pierce on November 17th 2017 6,483 reads

Hallo Pierce Hacker Mittag Profilbild

@ howdypierceHowdy Pierce

Chairman und Gründer

facebook Social iconTwitter Social icon

Meine Frau bringt die folgende Geschichte auf, wenn sie den Punkt bringen will, dass ich pedantisch bin: Als eine meiner Töchter in der zweiten Klasse war, erzählte ihr Mathematiklehrer der angenommen, eine beliebige Zahl geteilt durch Null war eins. Ich strich eine leidenschaftliche E-Mail an den Lehrer ab und bestand darauf, dass das Ergebnis undefiniert sein musste. Angeblich ist dies ein Beweis dafür, dass es mir manchmal schwer fällt, in der Nähe zu sein.

Es stellt sich heraus, dass der Witz auf mich gerichtet sein könnte — obwohl es immer noch schwierig ist, die Antwort des Lehrers der zweiten Klasse zu unterstützen. Ich habe kürzlich ein paar Dinge gelernt, die ich über Gleitkommamathematik nicht wusste:

  • Es gibt einen Wert für negative Null, getrennt von regulären (positiven?) null. Diese beiden Nullen sind so definiert, dass sie einander gleich sind, und dennoch sind sie unterschiedliche Werte.
  • x ÷ 0,0, für x ≠ ±0.0, ist kein Fehler. Stattdessen ist das Ergebnis entweder positive Unendlichkeit oder negative Unendlichkeit, nach der üblichen Vorzeichenkonvention.
  • Der Fall ±0,0 ÷ ±0,0 ist ein Fehler (insbesondere „keine Zahl“ oder NaN).
  • -0.0 + -0.0 = -0.0, -0.0 + 0.0 = 0.0, und -0,0 × 0,0 = -0,0

Diese Regeln stammen aus dem IEEE 754 „Standard for Floating-Point Arithmetic“, der Gleitkommadarstellungen plattformübergreifend standardisierte. Die neueste Version des Standards wurde 2008 fertiggestellt, aber die ursprüngliche Version wurde 1985 veröffentlicht, sodass dieses Verhalten nicht neu ist. Die obigen Regeln gelten sowohl in C (gcc) als auch in Swift auf meinem Mac und auch in Swift auf einem iPhone. Python auf dem Mac unterstützt negative Null für Gleitkommazahlen, löst jedoch eine Ausnahme aus, wenn Sie versuchen, durch Null eines beliebigen Vorzeichens zu dividieren.

Es gibt ein paar überraschende Folgerungen zu diesen Regeln:

  • Da 0,0 und -0,0 als gleich verglichen werden müssen, wird der Test (x < 0.0) gibt nicht für jede negative Zahl true zurück – es schlägt für negative Null fehl. Um das Vorzeichen eines Nullwerts zu bestimmen, müssen Sie daher die integrierte Vorzeichenfunktion der Plattform verwenden, z. B. Double .melden Sie sich schnell an. Oder ich denke, Sie könnten die rohe Darstellung des double bitmanipulieren, was die Antwort eines C-Programmierers ist.
  • Wenn a = b ÷ c , folgt daraus nicht unbedingt b = a × c , da dies auch für den Fall fehlschlägt, dass c Null eines der Vorzeichen ist.

Ich bin kein Zahlentheoretiker, aber ich finde die obigen Konzepte überraschend.

Ein unmittelbares Problem: Unendlichkeit ist keine Zahl, wie Null oder 3,25 oder π. Unendlichkeit ist vielmehr ein Konzept. Es ist wahr, dass die rationalen Zahlen zählbar unendlich sind — aber die Unendlichkeit ist kein Mitglied der Menge rationaler Zahlen.

Darüber hinaus ist die Division durch Null aus zahlentheoretischer Sicht unsinnig. Sie können verstehen, warum, wenn Sie genau wissen, was Teilung bedeutet. Technisch gesehen ist „Division“ „Multiplikation mit der Umkehrung einer Zahl“, wobei die Umkehrung Folgendes erfüllt: a × a ^ -1 = 1. Null ist die einzige Zahl in der Menge der reellen Zahlen, die einfach keine multiplikative Inverse hat. Und da diese Umkehrung nicht existiert, können wir nicht damit multiplizieren.

Aber die Leute, die Gleitkommazahlen entworfen haben, wussten das alles. Ich habe mich also gefragt, warum das beschriebene Verhalten in den IEEE-Standard geschrieben wurde.

Betrachten wir zunächst das Problem, das die Gleitkommamathematik zu lösen versucht. Die reellen Zahlen sind unzählbar unendlich, und doch wollen wir diese ganze Menge innerhalb der Grenzen des endlichen Computerspeichers darstellen. Mit einem 64-Bit-Double gibt es 2 ^ 64 mögliche Symbole, und die Designer des IEEE-Standards versuchten, diese Symbole auf eine Weise auf die Menge reeller Zahlen abzubilden, die sowohl für reale Anwendungen nützlich als auch angesichts der Einschränkungen von Silizium der frühen 80er Jahre wirtschaftlich machbar war. Angesichts der grundlegenden Anforderungen würden eindeutig Annäherungen verwendet.Die Argumentation für die negative Null scheint auf ein Papier von William Kahan aus dem Jahr 1987 zurückzuführen zu sein, einem Berkeley-Professor, der als „Vater des Gleitkommas“ gilt und später den Turing Award für seine Arbeit bei der Ausarbeitung von IEEE 754 gewann. Es stellt sich heraus, dass die Existenz einer negativen Null eng mit der Fähigkeit verbunden ist, durch Null zu teilen.

Beginnen wir mit dem üblichen Grund, warum die Division durch Null nicht zulässig ist. Ein naïver Ansatz zur Division durch Null ist die Beobachtung, dass:

Mit anderen Worten, wenn x kleiner wird, wird das Ergebnis von 1/ x größer. Dies gilt jedoch nur, wenn sich x von der positiven Seite 0 nähert (weshalb oben das kleine Pluszeichen steht). Das gleiche Gedankenexperiment von der negativen Seite ausführen:

Infolgedessen ist die generische Grenze von 1/ x, wenn sich x 0 nähert, undefiniert, da in der Funktion 1/x eine Diskontinuität (was Kahan einen Schlitz nennt) vorliegt.

durch die Einführung einer signierten Null könnten Kahan und das IEEE-Komitee die Schwierigkeit umgehen. Intuitiv wird das Vorzeichen einer Null genommen, um die Richtung anzuzeigen, aus der sich das Limit nähert. Wie Kahan in seinem Artikel von 1987 feststellt:

Anstatt +0 und -0 als unterschiedliche numerische Werte zu betrachten, stellen Sie sich ihr Vorzeichenbit als Hilfsvariable vor, die ein Bit Information (oder Fehlinformation) über jede numerische Variable übermittelt, die 0 als Wert annimmt. Normalerweise ist diese Information irrelevant; der Wert von 3+x unterscheidet sich nicht für x := +0 als für x := -0 …. Einige außergewöhnliche Rechenoperationen sind jedoch vom Vorzeichen der Null betroffen; zum Beispiel 1 / (+0) = +∞ aber 1 / (-0) = –∞.

Ich habe meinen Frieden mit dem Konzept geschlossen, indem ich eine von meinem Partner Mike Perkins vorgeschlagene Rationalisierung übernommen habe: Die verfügbaren 2 ^ 64-Symbole reichen eindeutig nicht aus, um die Gesamtheit der reellen Zahlen darzustellen. Daher haben die IEEE-Designer einige dieser Symbole für besondere Bedeutungen beiseite gelegt. In diesem Sinne bedeutet ∞ nicht wirklich „unendlich“ — stattdessen bedeutet es „eine reelle Zahl, die größer ist, als wir sie sonst in unserem Gleitkomma-Symbolsatz darstellen können.“ Und deshalb bedeutet +0 nicht wirklich „Null“, sondern „eine reelle Zahl, die größer als die wahre 0 ist, aber kleiner als jede positive Zahl, die wir darstellen können.“

Übrigens entdeckte ich bei der Recherche zu diesem Thema, dass selbst Kahan die Idee der negativen Null nicht liebt:

Signierte Null — nun, die signierte Null war ein Schmerz im Arsch, den wir beseitigen könnten, wenn wir den projektiven Modus verwenden würden. Wenn es nur eine Unendlichkeit und eine Null gäbe, könntest du es gut machen; dann kümmerst du dich nicht um das Zeichen von Null und du kümmerst dich nicht um das Zeichen der Unendlichkeit. Aber wenn Sie auf der anderen Seite darauf bestanden, was ich als die geringere Wahl von zwei Unendlichkeiten angesehen hätte, dann werden Sie mit zwei vorzeichenbehafteten Nullen enden. Es gab wirklich keinen Weg daran vorbei und du warst dabei.“ (Aus einem Interview von Kahan aus dem Jahr 2005.)

Ich bin mir nicht sicher, ob das Schreiben eines Blogposts zehn Jahre später das Schimpfen gegen einen armen Lehrer der zweiten Klasse wettmacht. Meine Tochter ihrerseits, jetzt in der High School, verdrehte nur die Augen, als ich anfing, beim Abendessen über die Division durch Null zu sprechen. Vielleicht ist das „schwer zu sein“ erblich.Kahan, W., „Verzweigungsschnitte für komplexe Elementarfunktionen oder viel Lärm um das Vorzeichenbit des Nichts“, Der Stand der Technik in der numerischen Analyse, (Hrsg. Iserles und Powell), Clarendon Press, Oxford, 1987, hier erhältlich.

Tags

Join Hacker Noon

Create your free konto, um Ihr benutzerdefiniertes Leseerlebnis freizuschalten.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.