Minus 0
wuerg, 15.04.2005 11:46
Es gibt zahlreiche Methoden, Zahlen zu speichern. Die grundlegende Art ist die Abbildung der ganzen Zahlen (unsigned integers) von 0 bis 2ⁿ−1 als Binärzahlen in n aufeinanderfolgenden Bits. Heute ist es üblich, höherwertige Stellen auch an höherwertigen Bits und unter höheren Adressen zu speichern, für n eine Zweierpotenz zu wählen und sich an die Wortgrenzen zu halten. Das war nicht immer der Fall, weil man die höherwertigen Adressen rechts denkt, die höherwertigen Stellen einer Zahl jedoch links schreibt.
Will man auch negative ganze Zahlen (signed integers) darstellen, so entscheidet man sich heutzutage, die unsigned integers u mit führender 1 als s=u−2ⁿ negativ zu interpretieren. Diese Darstellung heißt 2er‑Komplement, weil das normale Additionsverfahren zu s und −s immer 2, also 0 mit Übertrag ergibt.
Diese Darstellung ist keinesweg mit den Computern erfunden worden. Mechanische Rechenmaschinen hatten die gleichen Grundlagen. Nur verwendete man die Dezimaldarstellung und damit statt des 2er‑ das 10er‑Komplement. Beide leiden unter mangelnder Symmetrie. So gibt es unterhalb der 0 eine Zahl mehr als oberhalb. Diesen Mangel beseitig man nicht durch Streichung der kleinsten Zahl, denn die auf Computern übliche bitweise Negation stimmt nicht mit der arithmetischen überein. Leider ist not(s)=−s−1. Auch kann bei negativen Zahlen die häufig vorkommende Division durch eine Zweierpotenz nicht durch eine viel schnellere Bitverschiebung ersetzt werden.
Für binär dargestellte Zahlen werden die geschilderten Nachteile vermieden, indem man zum Wechsel des Vorzeichens einfach alle Bits umkehrt und die unsigned integers u mit führender 1 als negative Zahlen s=u−2ⁿ+1 interpretiert. Diese Methode heißt 1er‑Komplement, weil die Addition von s und −s auf eine Kette aus lauter Einsen führt. Für Dezimalzahlen ist es das 9er‑Komplement. Die so gewonnene Symmetrie ergibt eleganterweise not(s)=−s, und auch negative Zahlen können durch einfach Bitverschiebung durch eine Zweierpotenz geteilt werden.
Doch leider liefert das normale Additionsverfahren nicht immer das richtige Ergebnis. Das Carry‑Bit ist zusätzlich zu addieren, wodurch diese Zahldarstellung nur auf Computern Sinn macht, die diesen Zusatz (end-arround carry) in der Hardware realisiert haben. Außerdem liefert eine Addition zur 0 lauter 1‑Bits, die sogenannte negative Null, während die positive Null aus lauter 0‑Bits besteht. [1]
Man könnte eine der beiden verbieten, also durch die andere ersetzen. Schöner aber ist es, beide Nullen zu benutzen. Das gestattet elegante Programme, birgt aber auch Gefahren. So werden −0 und +0 im normalen Bitvergleich als verschieden getestet. Damit der unbedarfte Programmierer möglichst nie auf die 0 trifft, führt die Hardware Additionen als Subtraktionen (subtractive adder) aus.
Auch hier ist eine Unsymmetrie nicht wegzudiskutieren, die zu der Einsicht verhelfen sollte, daß es nicht immer möglich ist, etwas symmetrisch, ebenmäßig oder einfach darzustellen, was ungleich, holprig oder schwierig ist. Eine zunächst vorhandene Unsymmetrie (2er‑Komplement) weitgehend zu beseitigen und auf ein möglichst unbemerkt bleibendes Detail (+0 und −0) zu verschieben, ist eigentlich Augenwischerei. Ich halte das dualistische Bestreben, alles auf zwei komplementäre Teile zurückzuführen, für naiv und gefährlich. Man kann nicht 0 und 1, und und oder, positiv und negativ, links und rechts, wahr und falsch auf allen Ebenen vertauschen und erhält wieder das gleiche.
[1] Minus Zero. Fourmilab Switzerland. Beschreibung der Univac-1100-Serie, 36‑Bit-Rechner der Siebziger mit einer Wortbreite abseits heute üblicher Zweierpotenzen. In einem Wort konnten Zahlen von ±0 bis ±2³⁵−1 gespeichert werden, insbesondere zwei Nullen −0 und +0.
28 | Jahr 0 | 00 | noon
Will man auch negative ganze Zahlen (signed integers) darstellen, so entscheidet man sich heutzutage, die unsigned integers u mit führender 1 als s=u−2ⁿ negativ zu interpretieren. Diese Darstellung heißt 2er‑Komplement, weil das normale Additionsverfahren zu s und −s immer 2, also 0 mit Übertrag ergibt.
Diese Darstellung ist keinesweg mit den Computern erfunden worden. Mechanische Rechenmaschinen hatten die gleichen Grundlagen. Nur verwendete man die Dezimaldarstellung und damit statt des 2er‑ das 10er‑Komplement. Beide leiden unter mangelnder Symmetrie. So gibt es unterhalb der 0 eine Zahl mehr als oberhalb. Diesen Mangel beseitig man nicht durch Streichung der kleinsten Zahl, denn die auf Computern übliche bitweise Negation stimmt nicht mit der arithmetischen überein. Leider ist not(s)=−s−1. Auch kann bei negativen Zahlen die häufig vorkommende Division durch eine Zweierpotenz nicht durch eine viel schnellere Bitverschiebung ersetzt werden.
Für binär dargestellte Zahlen werden die geschilderten Nachteile vermieden, indem man zum Wechsel des Vorzeichens einfach alle Bits umkehrt und die unsigned integers u mit führender 1 als negative Zahlen s=u−2ⁿ+1 interpretiert. Diese Methode heißt 1er‑Komplement, weil die Addition von s und −s auf eine Kette aus lauter Einsen führt. Für Dezimalzahlen ist es das 9er‑Komplement. Die so gewonnene Symmetrie ergibt eleganterweise not(s)=−s, und auch negative Zahlen können durch einfach Bitverschiebung durch eine Zweierpotenz geteilt werden.
Doch leider liefert das normale Additionsverfahren nicht immer das richtige Ergebnis. Das Carry‑Bit ist zusätzlich zu addieren, wodurch diese Zahldarstellung nur auf Computern Sinn macht, die diesen Zusatz (end-arround carry) in der Hardware realisiert haben. Außerdem liefert eine Addition zur 0 lauter 1‑Bits, die sogenannte negative Null, während die positive Null aus lauter 0‑Bits besteht. [1]
Man könnte eine der beiden verbieten, also durch die andere ersetzen. Schöner aber ist es, beide Nullen zu benutzen. Das gestattet elegante Programme, birgt aber auch Gefahren. So werden −0 und +0 im normalen Bitvergleich als verschieden getestet. Damit der unbedarfte Programmierer möglichst nie auf die 0 trifft, führt die Hardware Additionen als Subtraktionen (subtractive adder) aus.
Auch hier ist eine Unsymmetrie nicht wegzudiskutieren, die zu der Einsicht verhelfen sollte, daß es nicht immer möglich ist, etwas symmetrisch, ebenmäßig oder einfach darzustellen, was ungleich, holprig oder schwierig ist. Eine zunächst vorhandene Unsymmetrie (2er‑Komplement) weitgehend zu beseitigen und auf ein möglichst unbemerkt bleibendes Detail (+0 und −0) zu verschieben, ist eigentlich Augenwischerei. Ich halte das dualistische Bestreben, alles auf zwei komplementäre Teile zurückzuführen, für naiv und gefährlich. Man kann nicht 0 und 1, und und oder, positiv und negativ, links und rechts, wahr und falsch auf allen Ebenen vertauschen und erhält wieder das gleiche.
[1] Minus Zero. Fourmilab Switzerland. Beschreibung der Univac-1100-Serie, 36‑Bit-Rechner der Siebziger mit einer Wortbreite abseits heute üblicher Zweierpotenzen. In einem Wort konnten Zahlen von ±0 bis ±2³⁵−1 gespeichert werden, insbesondere zwei Nullen −0 und +0.
28 | Jahr 0 | 00 | noon
... comment