Unum (Zahlenformat)

Aus testwiki
Zur Navigation springen Zur Suche springen
Zahlen, die zu einer anderen Basis als 10 dargestellt werden, insbesondere binär, werden mit der Basis dahinter tiefgestellt notiert; die Basis selbst wird immer dezimal notiert. So ist 10112=1110=11. Der Index 2 entfällt, wenn von Bitmustern o. Ä. die Rede ist, also nicht der numerische Wert im Vordergrund steht. Bitmuster werden in Schreibmaschinenschrift dargestellt, sofern technisch möglich.

Vorlage:Lang, kurz Unum,[1] sind ein Gleitkommazahlen-Format, das von John L. Gustafson, bekannt durch Gustafsons Gesetz, als Alternative zu den vorherrschenden Vorlage:NowrapGleitkommazahlen entwickelt wurde. Die erste Version von Unums wird retrospektiv als Typ I bezeichnet, als danach Typ II und später Typ III veröffentlicht wurden.

Vorlage:Zitat

Der wesentlichste interne Unterschied zu Vorlage:NowrapGleitkommazahlen ist das variable Format. Während durch den Vorlage:NowrapStandard – lediglich abhängig von der Bit-Zahl – eine feste Anzahl von Exponenten- und Mantissen-Bits vorgeschrieben ist, sind diese bei Unums variabel. Allen Unum-Formaten ist gemein, dass arithmetische Über- und Unterläufe nicht zu Unendlichkeiten degenerieren, sondern bei dem betragskleinsten bzw. -größten Intervallen bzw. Zahlen verbleiben. Laut Gustafson ist der numerische Fehler beim Abgleiten von endlichen Ergebnissen ins Unendliche unendlich, wohingegen das Zuweisen eines endlichen Werts möglicherweise ein großer, jedoch endlicher Fehler ist.

Zahlenmodell

Darstellung der projektiven Geraden als Kreis mit 0 unten, oben, 1 links und +1 rechts

Das mathematische Zahlenmodell hinter Vorlage:Nowrap und Vorlage:NowrapUnums ist die projektive Gerade, also die reellen Zahlen zusammen mit einem unendlich fernen Punkt , der durch Zahlen mit großem Betrag erreicht wird, egal ob negativ oder positiv. Wie 0 ist ohne Vorzeichen und wird von der negativen und der positiven Seite gleichermaßen erreicht. In der Praxis von Gleitkommazahlen sind 0, unendliche und undefinierte Werte grundsätzlich Spezialfälle; gewisse Metriken, die beispielsweise relative Genauigkeit angeben, sind darauf nicht sinnvoll anwendbar. Bei Unums wird für undefinierte Werte verwendet. Operationen auf endlichen Zahlen, die mathematisch wohldefiniert sind, produzieren nie als Ergebnis. Somit entspricht mehr einem Vorlage:Lang aus IEEE 754 als dessen unendlichen Werten. Wird beispielsweise durch die Addition zweier großer Zahlen der Wertebereich nach oben verlassen, runden Vorlage:NowrapGleitkommazahlen zu +; in Vorlage:Nowrap und Vorlage:NowrapUnums ist das Ergebnis dann ein Objekt, das das offene Intervall zwischen der größten exakt darstellbaren Zahl und + beschreibt. Vorlage:NowrapUnums stellen keine Intervalle dar, sie verbleiben dann bei dem größten endlichen Wert.

Das Zahlenmodell hinter Vorlage:NowrapUnums und IEEE 754 ist hingegen die abgeschlossene reelle Gerade, also die reellen Zahlen zusammen mit separaten Werten für und +. Dazu gesellen sich außerdem undefinierte Werte, auch NaN für engl. Vorlage:Lang genannt. Ferner unterscheidet IEEE 754 die Zahlen +0 und 0.

Grundsätzlich gibt es für jedes Unum x ein eindeutiges, genau dargestelltes Negatives x und bei Vorlage:NowrapUnums einen eindeutigen, genau dargestellten Kehrwert x1, wohingegen ein solcher Kehrwert für Vorlage:NowrapUnums nur für 0, und Zweierpotenzen garantiert ist.[2] In der üblichen Darstellung der projektiven Geraden (s. Bild) entspricht die Negation der Spiegelung an der vertikalen und die Kehrwertbildung an der horizontalen Achse; insbesondere gilt 01= und 1=0.

Typ I

Die erste Format von Unums, im Nachhinein Typ I genannt, war als Erweiterung der Vorlage:NowrapGleitkommazahlen konzipiert. Es verwendet in seiner Darstellung ein Vorlage:Lang (u für engl. Vorlage:Lang, unpräzise) am Ende, das angibt, ob die Zahl präzise ubit=0 oder ein offenes Intervall zwischen nebeneinanderliegenden Gleitkommazahlen ist (ubit=1). Das Layout ist dasselbe wie bei Vorlage:NowrapGleitkommazahlen, jedoch variiert die Anzahl der Exponenten- und Mantissenbits automatisch bzw. sind beide frei wählbar. Vorlage:NowrapUnums sind eine einfache Lösung für Intervallarithmetik.

Gustafson entwickelte Vorlage:NowrapUnums aus der Erfahrung, dass die Vorlage:NowrapKompatibilität wenig Nutzen bringt, aber viel Aufwand verursacht, der Teil mit Intervallarithmetik sich hingegen effizient umsetzen ließ.

Typ II

Die zweite Version von Unums verwirft die Kompatibilität zu Vorlage:NowrapGleitkommazahlen zugunsten großer Flexibilität. Die Haupterkenntnis war, dass sich vorzeichenbehaftete ganze Zahlen gut auf die projektive Gerade abbilden lassen, wobei der Überlauf bewusst in Kauf genommen wird, dafür die Ordnungsrelation erhalten bleibt. Insbesondere hat bei vorzeichenbehafteten Ganzzahlformaten mit Zweierkomplement-Darstellung von negativen Zahlen die kleinste negative Zahl (die mit maximalem Betrag) die Eigenschaft, ihr eigenes Negatives zu sein. Als Ganzzahl ist dieser Randfall gelegentlich ein Hindernis, für den unendlich fernen Punkt in der projektiven Geraden ist diese Eigenschaft hingegen natürlich und wünschenswert.

Wie Vorlage:NowrapUnums interpretieren Vorlage:NowrapUnums das letzte Bit in der Darstellung als Vorlage:Lang, das ein offenes Intervall zwischen exakten Zahlen repräsentiert. Diese Intervalle können am Ende der Berechnung kollabiert werden, etwa auf ihren arithmetischen oder geometrischen Mittelpunkt.

Für ein Vorlage:NowrapVorlage:NowrapUnum-Format werden 2n31 reelle, nicht notwendigerweise rationale, Zahlen größer als 1 ausgewählt und im ersten Quadranten auf der projektiven Geraden angesiedelt. Die anderen Quadranten ergeben sich durch Negativen- und Kehrwertbildung. Ein Vorlage:NowrapWort hat 2n Zustände, davon wird die Hälfte von Intervallen belegt und drei beliebige der vier Quadranten ergeben sich aus dem jeweils vierten. Da 1 als Wahl fest vergeben wird, gibt es eine Option weniger als 2n3.

Ein Beispiel für ein dezimales Vorlage:NowrapFormat: Gewünscht wird die exakte Darstellung der 31 Zahlen 10100, 1050, 1020, 1010, 106, 104, 1000, 500, 200, 100, 80, 50, 40, 25, 20, 12,5, 10, 9, 8, 7, 6, 5, 4, 0,31, 3, 2,5, 2, 0,61, 0,71, 1,25, 0,91. Die als Inverse angegebenen Zahlen sind Wünsche für den vierten Quadranten, auf eine Weise ausgedrückt, auf die sie ins Schema passen.

Die Operationen für Vorlage:NowrapUnums lassen sich im Allgemeinen nur durch eine Wertetabelle implementieren, was sie für Bitzahlen größer als ca. 20 behäbig macht, da Wertetabellen für zweistellige Operationen quadratisch anwachsen.

Gustafson entwickelte Vorlage:NowrapUnums, da sich Vorlage:NowrapUnums als schwerfällig für verschmolzene (engl. Vorlage:Lang) Operationen wie Fused multiply-add herausstellten. Das Ziel von Vorlage:NowrapUnums ist also, die Vorteile von Vorlage:NowrapUnums software- und hardware-freundlich umzusetzen.

SoRNs

Da die Formate vom Typ I und II die Zahlenbereiche flexibel und anwendungsspezifisch zulassen, reichen oft geringe Bitlängen aus. Im Fall von 8 Bit kann bereits ein Vorlage:NowrapWort eine beliebige Vereinigung von Intervallen darstellen (da 28 = 256, siehe Kardinalität der Potenzmenge). In diesem Kontext werden die exakten Zahlen als Einermenge mit ebendieser Zahl und als die Paarmenge {,+} gesehen, aber der Einfachheit wegen auch als Intervall bezeichnet. Ein so interpretiertes Wort heißt Vorlage:Lang für engl. Vorlage:Lang, zu deutsch (Teil-)Menge der reellen Zahlen. Dabei gibt das i‑te Bit an, ob das Intervall mit der Darstellung i eine Teilmenge der SoRN ist. Als Ergebnis einer Operation bedeutet ein SoRN, dass die mathematisch exakte Lösung darin enthalten ist. Eine korrekte Implementierung vorausgesetzt, ist die Aussage im mathematischen Sinn wahr und keine Approximation mit unbekannten Fehlerschranken.

Die Angabe von SoRNs ist üblicherweise als Intervall oder als Vereinigung von Intervallen, falls Lücken bestehen. Dabei wird hier der Deutlichkeit wegen in der unteren Grenze und in der oberen Grenze + geschrieben. Insbesondere stellt das Intervall (,+) die Menge der reellen Zahlen dar. Als offenes Intervall ist ansonsten (a,a) die leere Menge.

Im Vergleich zu Intervallarithmetik sind SoRNs auch dann gutartig, wenn sonst Stellenauslöschung oder durch unerkannte Abhängigkeiten jeder Iterationsschritt zu einem exponentiellen Genauigkeitsverlust führt. Wenn nicht gerade mit einem einelementigen Intervall begonnen wird, divergiert beispielsweise jede Folge von Intervallen nach traditioneller Intervallarithmetik, die durch wiederholte Anwendung der Operationen xx oder x/x entsteht (das heißt, die Intervalle werden immer größer und damit als Abschätzung unbrauchbar), wohingegen die von SoRNs beschriebenen Intervalle stetig kleiner werden und das Ergebnis festnageln.[3]

Arithmetik

Auf SoRNs lässt sich die Arithmetik der Unums fortsetzen: Sind U und V zwei SoRNs, so ist U+V das SoRN, das aus den Unums u+v mit u aus U und v aus V besteht. Analog wird Multiplikation definiert; Subtraktion und Division ergibt sich als UV gemäß U+(V) und entsprechend U/V gemäß UV1. Die einstelligen Operationen V und V1 werden auf die Einzelelemente angewendet. In mathematischer Notation:

U+V={u+v|uU und vV}
UV={uv|uU und vV}
UV={uv|uU und vV}
U/V={u/v|uU und vV}
U={u|uU}
U1={u1|uU}

Mit SoRNs sind auch Operationen möglich, deren Ergebnis auch im mathematischen Sinn nicht immer eine einzelne Zahl ist. Beispielsweise ist die Quadratwurzel-Funktion für negative Eingaben undefiniert. Als Operation auf SoRNs liefert 1 entsprechend das leere SoRN. Grundsätzlich ist es zwar möglich, auf jede undefinierte Operation das leere Ergebnis zu liefern, aber in gewisser Hinsicht sind andere Ergebnisse oft besser. Beispielsweise ist a/b die Antwort auf Frage: Welche Zahl x löst die Gleichung a=bx? Für a=0 und b=0 ist diese Antwort: jede Zahl. Daher ergibt 0/0 das volle SoRN. Dasselbe gilt für + und (was dasselbe sein muss, da +=). Ein Beispiel für eine undefinierte Operation, die weder das leere noch das volle SoRN liefert, ist 1 mit der Lösungsmenge [0,], also einem SoRN, das {±}, {0} und alle positiven Intervalle umfasst.

Beispielsweise gegeben das SoRN (0,+). Der Logarithmus davon (egal zu welcher Basis) ergibt (,+). Das Quadrat von diesem Ergebnis ist [0,+).

Ein weiteres Beispiel sei die Funktion f mit f(x)=11x+12.[3] Was ist f(0)? Eine Rechnung mit Unums ergibt 110+12=1+12=1=0. Nun ist es so, dass auch f(x)=2x2+x ist, wodurch die Definitionslücke bei 0 verschwindet, und das Ergebnis bestätigt. Doch was, wenn die Eingabe nicht genau bekannt war, sondern als das SoRN (1,2] gegeben wird? Wird die erste Darstellung von f verwendet, liefern die Operationen auf Vorlage:NowrapUnums exakte Ergebnisse und das Ergebnis-SoRN repräsentiert die Aussage 2<f(x)1. Für den zweiten Ausdruck mit traditioneller Intervallarithmetik wird zuerst das Eingabeintervall (1,2] zu [1,2] abgeschlossen (da traditionelle Intervallarithmetik nur mit abgeschlossenen Intervallen arbeitet). Das Ergebnis ist dann ernüchternd: [2,4]. In der zweiten Darstellung kommt x zweimal vor; dass es sich dabei zweimal um derselben Wert (innerhalb der Grenzen) handeln muss und nicht um zwei unabhängige Werte mit denselben Grenzen, wird aber beim mechanischen Auswerten nicht berücksichtigt.

Lauflängen-Kodierung

Ein SoRN gilt als zusammenhängend, wenn in seiner Darstellung alle Einsen gepackt nebeneinander stehen (schließt das leere SoRN mit ein). Weil an beiden Enden des Zahlenstrahls liegt, aber nur einmal im SoRN kodiert wird, ist das SoRN [,0][1,+] im mathematischen Sinn zwar nicht zusammenhängend (genauer: im Sinne der projektiven Geraden ist die Menge schon zusammenhängend, aber nicht im Sinne eines Zahlenstrahls mit Endpunkten), wohl aber das SoRN, das es darstellt. Die arithmetischen Grundoperationen und viele andere wie die Wurzel erhalten zusammenhängende SoRNs, das heißt, für zusammenhängende SoRNs als Eingaben liefern sie zusammenhängende SoRNs als Ergebnis. Daher bietet sich eine sogenannte Lauflängen-Kodierung (engl. Vorlage:Lang) an. Statt mit beliebigen SoRNs werden damit nur zusammenhängende dargestellt. Die Lauflängen-Kodierung speichert den Beginn und die Länge der Einser-Kolonne. Für 256 Stellen genügen 8 Bit für je den Beginn und die Länge, somit benötigt die Lauflängen-Kodierung insgesamt 16 Bit. Nur das volle SoRN ist zusammenhängend, kann aber streng genommen nicht so dargestellt werden, da seine Länge (256 Einsen) gerade das Maximum (255) in der Längendarstellung überschreitet. Dem kann abgeholfen werden, da für das leere SoRN formal mehrere Darstellungen existieren, nämlich alle mit Länge 0. Davon wird eine für das volle SoRN umgedeutet.

Insbesondere ist eine Lauflängen-Kodierung für SoRNs effektiver, je höher die Anzahl der Bits ist. Für Vorlage:NowrapUnums wäre ein allgemeines SoRN 65.536 Bit breit, also knapp 8 KiB groß. Die Lauflängen-Kodierung benötigt nur 32 Bit.

Beispiel

Für das Beispiel wird ein Vorlage:NowrapVorlage:NowrapUnum verwendet, wobei die einzige wählbare Zahl 2 ist. Es gibt die 16 Intervalle {±}, (,2), {2}, (2,1), {1}, (1,12), {12}, (12,0), {0}, (0,+12), {+12}, (+12,+1), {+1}, (+1,+2), {+2} und (+2,+). Ein Teilmengen-Wort besteht damit aus 24=16 Bit.

Allgemein braucht es die Lauflängen-Kodierung von 2n Bit genau 2n Bits.

Typ III

Das System der Vorlage:NowrapUnums wird auch als Vorlage:Lang bezeichnet. Das englische Wort Vorlage:Lang bedeutet Postulat. Die Posits sind die eigentlichen Zahlen, mit denen gerechnet wird; die Vorlage:Lang definieren Intervalle mit Grenzen von Posits gleichen Formats. Der primäre Zweck von Valids ist Fehlerabschätzung, die sich durch die hohe Fehlertoleranz der Posit-Grenzen oft in brauchbaren Rahmen bewegt. Der große Vorteil von Intervallarithmetik ist (typischerweise), dass das wahre Ergebnis garantiert innerhalb der Intervallgrenzen liegt. Intervallarithmetik läuft daher immer Gefahr, dass die untere und obere Intervallgrenze so weit auseinander liegen, dass die Aussage zwar richtig ist, das Ergebnis aber praktisch keine Aussagekraft mehr besitzt.

IEEE-Gleitkommazahlen erlauben bei der Auswertung der vom Standard vorgeschriebenen transzendenten Funktionen Fehler, die über den Rundungsfehler hinausgehen, hauptsächlich damit die Wertetabellen in der Hardware nicht zu groß werden. Solche Zugeständnisse machen Posits nicht.[2] Im Gegenteil: Implementierungen von Vorlage:NowrapUnums müssen eine Skalarprodukt-Operation (auch Vorlage:Lang genannt) anbieten, deren Ergebnis präzise auf das letzte Bit berechnet wird. Die Operationen Vorlage:Lang und Vorlage:Lang sind Spezialfälle des Skalarprodukts. (Präzise heißt innerhalb der Rundungsgenauigkeit.) Das Skalarprodukt ist außerdem nicht in der Länge beschränkt; Implementierungen müssen mit jeder Anzahl von Summanden rechnen. Dazu wird ein Puffer verwendet, Vorlage:Lang genannt. Geeignete Quire-Größen sind in einer Tabelle unten aufgelistet.

Die Posits bestehen aus einem Vorzeichen-Bit (engl. Vorlage:Lang), einer variablen Anzahl von Regime-Bits, die über grobe Größenordnung entscheiden (und zu denen kein Vorlage:NowrapÄquivalent existiert), Exponenten-Bits und Mantissen-Bits.

Die Anzahl der Regime-, Exponenten- und der Mantissen-Bits variiert.[2] Bestimmungsgrößen eines Unum-Formats sind seine Gesamtbits (in der Praxis meist eine Zweierpotenz) und seine maximalen Exponentenbits Emax. Ein nVorlage:NowrapUnum erlaubt nach Abzug des Vorzeichenbits für einen konkreten Posit zwischen 2 und n1 Regime-Bits. Aufgrund der Konstruktion muss die Anzahl der Regime-Bits mindestens 2 betragen (zur Konstruktion s. unten). Nimmt das Regime mehr Bits ein, als gemäß Gesamtbits minus Emax verbleiben, ist die Anzahl der Exponentenbits nachrangig, entsprechend reduziert und kleiner als Emax. Die ggf. übrigen Bits entfallen auf die Mantisse.

In der Anwendung kann der unendlich ferne Punkt durch NaR ersetzt werden, was für keine reelle Zahl steht (Vorlage:EnS). Alle Operationen auf NaR ergeben wieder NaR, insbesondere ist 1NaR=NaR, wohingegen 1=0 ist. Als Grund für die Abweichung von keine Zahl (Vorlage:EnS, kurz NaN) nennt Gustafson, dass es sich bei einigen Ergebnissen wie 1 um (komplexe) Zahlen handelt.[4]

Beispielformat

Gegeben das Format mit 16 Bits und Emax=2. Hat ein solches Posit 4 Regime-Bits, ergibt sich die Verteilung 1 : 4 : 2 : 9 auf Vorzeichen, Regime, Exponent und Mantisse. Hat es 12 Regime-Bits ist die Verteilung 1 : 12 : 2 : 1 und bei 14 Regime-Bits 1 : 14 : 1 : 0.

Kennzahlen

Aus der Anzahl der Gesamtbits und der maximalen Exponentenbits ergibt sich die Kennzahl des useed (u für Unum und engl. Vorlage:Lang für Samen oder Keim) als useed=2Emax. Für ein Unum-Format mit bis zu 2 Exponentenbits beträgt useed=222=24=16. Bei bis zu 3 Exponentenbits beträgt das useed=256 und bei 4 schon useed=65536.

Im Unterschied zu IEEE 754 haben Unums keinen Exponenten-Bias oder eine vergleichbare Größe.

Menge der Zahlen

Da die negativen Zahlen und die Bitmuster ihrer Darstellungen aus den positiven hervorgehen, müssen nur letztere beschrieben werden. Die Menge der nVorlage:NowrapUnums wird iterativ erzeugt, wobei n3 sein muss. Ausgehend vom einfachsten Format bestehend aus 3-Bit-Unums, die jeweils nur aus Vorzeichen (1 Bit) und Regime (min. 2 Bit, s. unten für eine Begründung), wird das Format für n+1 Bits durch Anfügen eines Bits an das Format mit n Bits definiert. Mit max wird die größte positive und mit min die kleinste positive Zahl im aktuellen Format bezeichnet. Zwar gilt minmax1, die Gleichheit gilt jedoch nur, falls es Zweierpotenzen sind.

Die Menge der 3-Bit-Unums besteht aus 8 Elementen: 0 und , 1 und +1 sind fest vorgegeben; dazu kommt das von der maximalen Anzahl Emax von Exponentenbits abhängige useed, zusammen mit useed, useed1 und useed1. (Dabei ist Emax0 frei wählbar.) Auch wenn keine Darstellung im 3Vorlage:NowrapFormat Exponentenbits nutzt, weil die Regime-Bits „immer alles auffressen“, wird Emax festgelegt, da der Wert von useed davon abhängt. Bei der iterativen Darstellung der Zahlenmenge bleibt Emax gleich, nur die Bitanzahl wird erhöht. Das 3Vorlage:NowrapUnum ist lediglich der Startpunkt der Konstruktion. Im 3Vorlage:NowrapFormat ist max=useed.

Für den Schritt vom nVorlage:NowrapUnum zum (n+1)Vorlage:NowrapUnum wird an jede Darstellung ein Bit angefügt. Ist dieses Bit 0, bleibt der repräsentierte Wert derselbe, unabhängig ob das Bit dem Regime, dem Exponenten oder der Mantisse zufällt. Ist das Bit 1, so stellt das Bitmuster eine neue Zahl dar, die zwischen den beiden Zahlen liegt, deren Darstellungen, interpretiert als ganze Zahl, je um 1 größer und kleiner sind:

  • Zwischen max und wird maxuseed eingefügt und entsprechend max/useed zwischen min und 0. Das hinzugefügte Bit wird Teil des Regimes.
  • Zwischen 2m und 2n, wobei m und n mehr als 1 auseinanderliegen, wird das geometrische Mittel von 2m und 2n eingefügt: 2(m+n)/2. Das hinzugefügte Bit wird Teil des Exponenten.
  • Andernfalls wird zwischen x und y ihr arithmetisches Mittel x+y2 hinzugefügt. Das hinzugefügte Bit wird Teil der Mantisse.

Der erste Punkt fügt viele exponentiell auseinanderliegende Zahlen an den extremen Rändern hinzu. In einem gewissen Sinne approximieren sie 0 und damit gut. Der letzte Punkt fügt viele linear auseinanderliegende Zahlen um 1 ein. Exponentiell bzw. linear auseinanderliegend bedeutet: Sind x<y<z aufeinanderfolgend, so ist im ersten Fall z=yyx und im zweiten Fall z=y+(yx). Konstruktionsbedingt ist die Summe m+n im zweiten Punkt eine gerade ganze Zahl, deren Hälfte somit eine ganze Zahl ist.

Die ersten Konstruktionsschritte für die positiven Posits mit Emax=1, das heißt mit useed=24, sind:

  • Ausgangsformat mit 3 Bits
{0,1/useed,1,useed,}
={0,24,20,24,}; min=24 und max=24.
  • Format mit 4 Bits:
{0,min/useed,24,2(4+0)/2,20,2(0+4)/2,24,maxuseed,}
={0,28,24,22,20,22,24,28,}; min=28 und max=28.
  • Format mit 5 Bits:
{0,min/useed,28,2(84)/2,24,2(42)/2,22,2(2+0)/2,20,2(0+2)/2,22,2(2+4)/2,24,2(4+8)/2,28,maxuseed,}
={0,212,28,26,24,23,22,21,20,21,22,23,24,26,28,212,}; min=212 und max=212.
  • Format mit 6 Bits:
{0,min/useed, 212, 2(128)/2, 28, 2(86)/2, 26, 2(64)/2, 24, 24+232, 23, 23+222, 22, 22+212, 21, 21+202, 20, 20+212, 21, 21+222, 22, 22+232, 23, 23+242, 24, 2(4+6)/2, 26, 2(6+8)/2, 28, 2(8+12)/2, 212, maxuseed, }
={0, 216, 212, 210, 28, 27, 26, 25, 24, 11224, 23, 11223, 22, 11222, 21, 11221, 20, 112, 21, 11221, 22, 11222, 23, 11223, 24, 25, 26, 27, 28, 210, 212, 216, }; min=216 und max=216.

Ist UnEmax die Menge der nVorlage:NowrapUnum mit höchstens Emax Exponentenbits, so gilt

|UnEmax|=2n,

das heißt, es werden keine Bitmuster verschwendet. Außerdem ist durch die Beziehung

UnEmaxUn+1Emax

gesichert, dass eine Erhöhung der Bitanzahl nur mehr Zahlen dargestellt werden können, aber keine verschwinden.

Die Menge

UEmax=n3UnEmax

der durch Unums darstellbaren projektiven reellen Zahlen liegt dicht in {}, was bedeutet, dass sich jede reelle Zahl beliebig genau durch ein Unum approximieren lässt.

Interpretation eines Bitmusters

Ausgenommen soll die Ordnung auf Postits mit der Ordnung auf ihren Darstellungen übereinstimmen, wobei die Darstellungen als vorzeichenbehaftete ganze Zahlen in Zweierkomplement-Darstellung interpretiert werden. Aus der Menge der Zahlen und dieser Voraussetzung ergibt sich bereits eindeutig, welche Zahl von einer beliebigen Postits-Darstellung beschrieben wird. Hier folgt ein anschauliches, effektives Verfahren.

Besteht das Bitmuster aus 000, so repräsentiert es 0; besteht es aus 100, so repräsentiert es . Nachfolgend werden diese beiden Fälle ausgeschlossen.

Das Vorzeichen ist das erste (= höchstwertige) Bit s. Wie bei IEEE 754 ist die Interpretation, dass für s=0 die Zahl positiv und für s=1 negativ ist. Davon ausgenommen sind die Werte 0 und ; tatsächlich hat 0 technisch gesehen das Vorzeichenbit 0 und das Vorzeichenbit 1, dennoch werden beide als weder positiv noch negativ bezeichnet. Im Unterschied zu IEEE-Gleitkommazahlen speichern Posits nicht ein Vorzeichen und einen Betrag.

Die folgenden Betrachtungen werden für s=0 angegeben. Ist s=1, so wird die Zahl vor dem Bestimmen der Kennzahlen per Zweierkomplement nicht-negativ gemacht.

Die Lauflänge k (engl. Vorlage:Lang) einer konkreten Zahl ergibt sich aus den Regime-Bits. Das Regime folgt auf das Vorzeichen und besteht aus einer Folge gleicher Binärziffern, die durch die jeweils andere Binärziffer beendet wird oder bis zum Ende läuft. Das Regime hat also immer die Form 001 oder 110 oder, falls das Regime den kompletten Rest der Zahl einnimmt, 111 und die kürzestmögliche Formen sind 01, 10 und 11. Für Gesamtlänge 5 sind die möglichen Regimes zwischen 2 und 4 Bits lang, konkret 0001, 001, 01, 10, 110, 1110 und 1111. Führen Nullen das Regime an, so ist k die Anzahl dieser Nullen, also ist k negativ. Für 0001 ist k=3 usw. bis 01 für k=1. Führen hingegen Einsen das Regime an, so ist k+1 die Anzahl dieser Einsen, also ist k positiv oder null. Für 10 ist k=0, für 110 ist k=1 usw. bis 1111 für k=3. Das Regime kann nicht aus nur Nullen bestehen, denn dann wäre das Bitmuster (je nach Vorzeichenbit) das für 0 oder (s. oben).

Es bezeichnet e den numerischen Wert der Exponentenbits, ggf. ergänzt um Nullen, interpretiert als vorzeichenlose binäre Zahl. Ist nämlich die Anzahl der Exponentenbits kleiner als Emax, werden für die Bestimmung von e fiktive Nullen an das Bitmuster angefügt, sodass die vorzeichenlose Zahl aus genau Emax binären Ziffern besteht.

Sind in der Darstellung am Ende noch Bits übrig, die nicht vergeben wurden, so entfallen sie auf die Mantisse. Gibt es F Mantissenbits und ist F>0, so sei f der numerische Wert der Mantissenbits, interpretiert als vorzeichenlose binäre Zahl; andernfalls setze f=0.

Für die Bestimmung des numerischen Werts eines Unums aus seinem Bitmuster ist

(1)suseedk2e(1+f/2F).

Anschaulich trägt die Mantisse den Faktor 1,f1fF (in Binärdarstellung) bei, wobei fi die binären Ziffern in der Mantisse bezeichnen. In den Begriffen von IEEE 754 ist das Hidden Bit immer 1 und Unums haben generell auch keine subnormalen Zahlen. Der Wert von useed ist so gewählt, dass 2|e|<useed gilt. Dadurch ist die Darstellung auch eindeutig.

Die Lauflänge erzeugt sehr schnell sehr große oder kleine Beträge auf Kosten der Genauigkeit in der Mantisse, jedoch lassen kurze Regimes, also Lauflängen nahe 0 und somit Zahlen nahe 1, viel Platz für Mantissenbits. Dadurch lassen sich im Vergleich zu Vorlage:NowrapGleitkommazahlen bei derselben Gesamtbitzahl sowohl betragsmäßig größere Zahlen darstellen als auch Zahlen um 1 genauer auflösen.

Konsequenzen der Darstellung

Ein Posit wird negiert, indem seine Darstellung als Ganzzahl gemäß Zweierkomplement negiert wird. Da die Zweierkomplement-Operation sowohl die Darstellung der 0 als auch die Darstellung von gleich lässt, wird für deren Negation keine Sonderfallbehandlung gebraucht.

Durch die Zweierkomplement-Darstellung ist der Größer-/Kleiner-Vergleich ohne Bestimmung der Kennzahlen möglich (sofern das Format, also Gesamtbreite und Emax, gleich ist). Mit Ausnahme von ist ein Posit kleiner bzw. größer als ein anderes, falls ihre Darstellungen interpretiert als vorzeichenbehaftete Ganzzahlen dieselbe Relation haben. Die Zahlen müssen nicht aufwendig decodiert werden.

Beispielbitmuster

Als Typ setze ein Vorlage:NowrapUnum mit Exponentenlänge Emax=3 ein. Die Zahl hat das Bitmuster 0:0001:101:11011101, dabei trennt der Doppelpunkt Vorzeichen-, Regime-, Exponenten- und Mantissenbits.

  1. Sonderfälle 0 und : Liegen nicht vor.
  2. Bestimme useed=223=256.
  3. Vorzeichen 0: s=0.
  4. Laufweite 0001: k: Es führen 3 Nullen, somit k=3, d. h, k=3.
  5. Exponent 101: e=1012=510.
  6. Mantisse 11011101: f=110111012=22110 mit F=8.

Daraus ergibt sich

(1)suseedk2e(1+f/2F)=
(1)0256325(1+221/28)=
122425(1+221/28)

Der letzte Ausdruck ergibt 3,553926944732666015625106.[5]

Tabelle mit Beispielwerten

Für ein weiteres Beispiel betrachten wir das Format mit 8 Bits und Emax=3 sowie Emax=1. Dann ist useed=256 bzw. Emax=4. Einige Zahlen und ihre Werte sind in der Tabelle unten eingetragen.

Falls die Anzahl der Exponentenbits kleiner als Emax ist, werden die impliziten Exponentenbits unterstrichen.

Werte von s, k, e, F und f für Emax=3 Interpretation
für Emax=3
Bitmuster Werte von s, k, e, F und f
für Emax=1
Interpretation
für Emax=1
nicht definiert 10000000 nicht definiert
k=6 useed6=2482,811014 01111111 k=6,e=0_2=0 useed6=212=4096
k=5 useed5=2401,101012 01111110 k=5,e=0_2=0 useed5=210=1024
k=4,e=100_2=4 useed424=284+4=2366,871010 01111101 k=4,e=1 useed421=224+1=512
k=3,e=010_2=2 useed322=283+2=2266,71107 01111001 01111001 k=3,e=0,F=1,f=1 useed320(1+1/21)=96
k=2,e=1012=5 useed225=282+5=221=2097152 01110101 01110101 k=2,e=1,F=2,f=1 useed221(1+1/22)=40
k=1,e=6,F=1,f=1 useed126112=281+6112=214112=214213=24576 01101101 01101101 k=1,e=1,F=3,f=1012=5 useed121(1+5/23)=8158=13
k=1,e=5,F=1,f=0 useed125=281+5=8192 01101010 01101010 k=1,e=1,F=3,f=0102=2 useed121(1+2/23)=8114=10
k=0,e=3,F=2,f=2 useed023112=12 01001110 01001110 k=0,e=0,F=4,f=14 1+14/24=1,875
k=0,e=3,F=2,f=1 8114=10 01001101 01001101 k=0,e=0,F=4,f=13 1+13/24=1,8125
k=0,e=0,F=2,f=3 20134=134=1,75 01000011 01000011 k=0,e=0,F=4,f=3 1+3/16=1,1875
k=0,e=0,F=2,f=2 112=1,5 01000010 01000010 k=0,e=0,F=4,f=2 1+2/16=1,125
k=0,e=0,F=2,f=1 114=1,25 01000001 01000001 k=0,e=0,F=4,f=1 1+1/16=1,0625
k=0,e=0,F=2,f=0 1 01000000 01000000 k=0,e=0,F=4,f=0 1
k=1,e=7,F=2,f=3 useed127134=287134=(134)/2=0,875 00111111 00111111 k=1,e=1,F=4,f=15 useed121(1+15/16)=(1+15/16)/2=0,96875
k=1,e=7,F=2,f=2 useed127112=287112=(112)/2=0,75 00111110 00111110 k=1,e=1,F=4,f=14 useed121(1+14/16)=(1+14/16)/2=0,9375
k=1,e=7,F=2,f=2 useed127114=287114=(114)/2=0,625 00111101 00111101 k=1,e=1,F=4,f=13 useed121(1+13/16)=(1+13/16)/2=0,90625
k=1,e=4,F=2,f=2 useed124112=112/16=0,09375 00110010 00110010 k=1,e=1,F=4,f=2 useed12118=118/2=0,564
k=1,e=1,F=2,f=1 useed121114=27114=0,009765625 00100101 00100101 k=1,e=0,F=4,f=5 useed1(1+5/16)=(1+5/16)/4=0,328125
k=2,e=7,F=1,f=1 useed227112=291120,0029297 00011111 00011111 k=2,e=1,F=3,f=7 useed22178=23178=0,234375
k=2,e=2,F=1,f=1 useed225112=0,000732421875 00010101 00010101 k=2,e=0,F=3,f=5 useed2158=158/16=0,1015625
k=3,e=6 useed326=283+6=2183,8147106 00001110 00001110 k=3,e=1,F=2,f=2 useed32112=25112=0,046875
k=4,e=010_2=4 useed424=284+4=2283,73109 00000101 00000101 k=4,e=0,F=1,f=1 useed4112=112/28=0,005859375
k=5,e=100_2=4 useed524=2361,461011 00000011 k=5,e=1 useed521=2114,88104
k=5,e=0002=0 useed5=2409,091013 00000010 k=5,e=0 useed5=2109,77104
k=6 useed6=2483,551015 00000001 k=6 useed6=2122,44104
nicht definiert 0 00000000 nicht definiert 0

In den fünf Zeilen um die Eins ist deutlich, dass die Kehrwerte nicht eindeutig darstellbar sind, aber auf die korrespondierenden Werte abgebildet werden. Exakte Kehrwerte existieren genau für die Zahlen mit f=0, also Zweierpotenzen. Weil das Regime für Zahlen mit sehr großem oder sehr kleinem Betrag viele Bits einnimmt und so zunehmend wenige für die Mantisse übrig lässt, sind an den Rändern besonders viele Zweierpotenzen. Durch großes Emax lässt sich dieser Effekt verstärken, jedoch auf Kosten von Zahlen in der Nähe von 1 (und entsprechend 1). In der Praxis ist Emax eher klein, so ist Emax=1 für Vorlage:NowrapUnums eine typische Wahl.

Darstellen einer Zahl als Posit

Für x=0 und x= ist die Darstellung klar. Für x<0 bestimmt man das Bitmuster von |x| und wendet darauf das Zweierkomplement an.

Sei also x>0 darzustellen. Zuerst bestimme die Lauflänge kloguseed(x) maximal oder (mit anderen Worten) bestimmt k=loguseed(x) (wobei das Runden zur nächsten ganzen Zahl in Richtung bedeutet). Dadurch sind die Regime-Bits eindeutig festgelegt. Falls noch Bits für den Exponenten übrig sind, bestimme elog2(x/useedk) maximal, d. h. e=log2(x/useedk). Falls noch F Bits für die Mantisse übrig sind, bestimme

fopt=(xuseedk2e1)2F.

Dann gilt

x=useedk2e(1+fopt/2F),

jedoch ist fopt nicht notwendig ganzzahlig. Daher wird f als der gerundete Wert von fopt bestimmt (mit der üblichen Rundung zur nächstgelegenen ganzen Zahl), wobei zur nächsten geraden Zahl gerundet wird, wenn fopt genau zwischen zwei ganzen Zahlen liegt. Zuletzt stellt man e und f binär dar, wobei f im Allgemeinen nicht eingesetzt wird, sondern einaddiert. Beim Runden von fopt kann ein Überlauf auftreten, denn sind F Mantissenbits vorgesehen, kann es vorkommen, dass der Wert von f genau (F+1) Bits zur Darstellung braucht. Möglichst einfach formuliert wird die Darstellung für das Posit mit fiktivem f=0 mit der Darstellung von f addiert (die Darstellungen interpretiert als Ganzzahl). Passt f in F Bits, ist das dasselbe als würden die letzten Bits einfach gesetzt. Im Ausnahmefall führt dies zur korrekten Anpassung des Exponenten und ggf. Regimes. Eine Ausnahmebehandlung, um nicht einen endlichen Wert auf zu runden, ist nicht notwendig, da am oberen Rand des Zahlenbereichs die Regime-Bits die komplette Darstellung einnehmen und weder e noch f berechnet werden.

Beispiel x=0,1 für das Vorlage:NowrapFormat mit Emax=1. Dann ist useed=4 und log4(0,1)1,166, also ist die Lauflänge k=2; die Regime-Bits sind somit 001. Es bleiben nach Abzug des Vorzeichenbits noch ein Exponenten-Bit und drei Mantissen-Bits. Für den Exponenten ergibt sich elog2(1,16)0,168, also abgerundet, e=0. Für die Mantisse ergibt sich

fopt=(1,161)23=0,168=4,18

und so ergibt sich nach Rundung f=5. Für die Darstellung bestimmt man e=0=02 und f=5=1012 und es ergibt sich 0:001:0:101. Gegenrechnen ergibt

useedk2e(1+f/2F)=4220(1+5/8)=158/16=0,1015625.

Der Wert findet sich auch in der Tabelle oben.

Beispiel x=0,9999 für das Vorlage:NowrapFormat mit Emax=1. Dann sind k=1 und e=1. Es ergibt sich insbesondere

fopt=(0,99994(1)211)24=15,9996816.

Nun passt 16=100002 nicht in F=4 Bits. Die Darstellung ohne f wäre 0:01:1:0000 was mit 100002 addiert wird. Das ergibt 0:10:0:0000, was die Zahl 1 darstellt. Die größte Zahl kleiner als 1 wird von 0:01:1:1111 dargestellt und ist 0,96875.

Die Werte finden sich in der Tabelle oben.

Beispiel x=0,1 für das Vorlage:NowrapFormat mit Emax=3. Dann ist useed=256 und log256(0,1)0,415, also ist die Lauflänge k=1; die Regime-Bits sind somit 01. Es bleiben noch 3 Exponenten- und 2 Mantissen-Bits. Für den Exponenten ergibt sich elog2(x256)=log2(25,6)4,678, also e=4=1002. Für die Mantisse ergibt sich

fopt=(0,12561241)22=(1,61)22=2,4.

Daraus ergibt sich f=2=102. Die Darstellung ist also 0:01:100:10. Gegenrechnen ergibt

useedk2e(1+f/2F)=256124(1+2/4)=11216=0,09375.

Auch dieser Wert findet sich auch in der Tabelle oben.

Der relative Fehler beträgt beim ersten Beispiel 0,1015625/0,11=1,5625% und beim letzten 0,1/0,093751=623%. Die Beispiele zeigen, dass der größere Wertebereich mit einem Genauigkeitsverlust erkauft wird.

Ausnutzen der Posit-Darstellung

Gegenüberstellung der schnellen Sigmoid-Funktion und der fast_sigmoid-Implementierung für 8-Bit Posits

In einem Vorlage:NowrapUnum mit Emax=0 kann die Sigmoidfunktion x11+ex näherungsweise sehr schnell berechnet werden, indem die Darstellung der Unums ausgenutzt wird. Statt aufwendig die Exponentialfunktion auszuwerten, wird das Vorzeichenbit invertiert und die Darstellung logisch um 2 Stellen nach rechts verschoben. In C entspricht das dem Ausdruck (x ^ 0x80) >> 2.[2] Von der Idee her ist der Ansatz ähnlich wie der zur Berechnung des Kehrwerts der Quadratwurzel.

Standard-Posits

Für die Bitzahlen 16, 32, 64, 128 und 256 existieren Vorlage:NowrapFormate. Geeignete Wahlen von Emax nähern deren Wertebereiche an.

Bits Exp.
(IEEE)
Wertebereich
(IEEE)
Emax
(Posit)
Wertebereich
(Posit)
Quire-Bits
(Posit)
8 0 2104 bis 4104Vorlage:0 n. a.
16 5 6108 bis 710+4 1 4109 bis 310+8 128=27Vorlage:0
32 8 11045 bis 310+38 3 61073 bis 210+72 1024=210
64 11 510324 bis 210+308 4 210299 bis 410+298 4096=212
128 15 6104966 bis 110+4932 7 1104855 bis 110+4855 65536=216
256 19 21078.984 bis 210+78913 10 21078297 bis 510+78296 1048576=220

Einzelnachweise