Ein Minifloat ist eine binäre Darstellung einer Gleitkommazahl mit sehr wenigen Bits.
Der Minifloat in dieser Frage wird als eine 6-Bit-Zahl m
mit der folgenden Darstellung definiert:
1 Bit zur Darstellung des Vorzeichens der Zahl. Dieses Bit wird angezeigt,
0
wenn die Zahl positiv und1
die Zahl negativ ist.3 Bits zur Darstellung des Exponenten der Zahl, versetzt um
3
(dh ein Exponent von110
repräsentiert tatsächlich einen Faktor von 2 3 , nicht 2 6 ).- Ein Exponent von
000
bezieht sich auf eine subnormale Zahl. Die Mantisse bezieht sich auf den Bruchteil einer Zahl mit einem ganzzahligen Teil0
multipliziert mit einem Faktor des niedrigstmöglichen Exponenten (in diesem Fall 2 -2 ).
- Ein Exponent von
2 Bits zur Darstellung der Mantisse der Zahl. Wenn der Exponent etwas anderes als
000
oder ist111
, stellen die 2 Bits den Bruchteil nach a dar1
.- Ein Exponent von
111
stellt dar,infinity
ob die Mantisse ist0
, undNaN
(keine Zahl) sonst.
- Ein Exponent von
In dem Wikipedia-Artikel wird dies als (1.3.2.3) Minifloat bezeichnet.
Einige Beispiele für die Darstellung dieses Minifloats:
000000 = 0.00 = 0
000110 = 1.10 × 2^(1-3) = 0.375
001100 = 1.00 × 2^(3-3) = 1
011001 = 1.01 × 2^(6-3) = 10
011100 = infinity
011101 = NaN
100000 = -0.00 = -0
100011 = -0.11 × 2^(1-3) = -0.1875 (subnormal)
101011 = -1.11 × 2^(2-3) = -0.875
110100 = -1.00 × 2^(5-3) = -4
111100 = -infinity
111111 = NaN
Ihre Aufgabe ist es, ein Netzwerk von NAND-Gattern mit zwei Eingängen aufzubauen, das 6 Eingänge für einen Minifloat a
und 6 Eingänge für einen Minifloat verwendet b
und 6 Ausgänge für den Minifloat zurückgibt a + b
.
Ihr Netzwerk muss ordnungsgemäß Subnormale hinzufügen. Zum Beispiel muss
000001
+000010
gleich000011
und001001
+000010
= sein001010
.Ihr Netzwerk muss Unendlichkeiten korrekt addieren und subtrahieren. Alles, was einer Unendlichkeit endlich hinzugefügt wird, ist dieselbe Unendlichkeit. Positive Unendlichkeit plus negative Unendlichkeit ist
NaN
.Ein
NaN
Plus alles muss gleich einNaN
, obwohlNaN
es gleich ist, liegt an Ihnen.Wie Sie damit umgehen, positive und negative Nullen miteinander zu addieren, bleibt Ihnen überlassen, obwohl Null plus Null gleich Null sein müssen.
Ihr Netzwerk kann je nach Bedarf eine der folgenden Rundungsregeln implementieren:
- Abrunden (gegen negative Unendlichkeit)
- Aufrunden (gegen positive Unendlichkeit)
- Runden Sie in Richtung Null
- Rund weg von Null
- Rundung auf den nächsten Wert, wobei die Hälften gemäß einer der oben genannten Regeln gerundet werden
Zur Vereinfachung können Sie in Ihrem Diagramm UND-, ODER-, NICHT- und XOR-Gatter mit den folgenden entsprechenden Ergebnissen verwenden:
NOT: 1
AND: 2
OR: 3
XOR: 4
Jede dieser Bewertungen entspricht der Anzahl der NAND-Gatter, die zum Aufbau des entsprechenden Gatters erforderlich sind.
Die Logikschaltung, die die wenigsten NAND-Gatter verwendet, um alle obigen Anforderungen korrekt zu implementieren, gewinnt.
quelle
Antworten:
830 NANDs
Es werden 24 NOTs, 145 ANDs, 128 ORs, 33 XORs verwendet. Es rundet immer in Richtung Null, es kann entweder -0 oder +0 für Nullwerte zurückgeben, und ich glaube, es behandelt Unendlichkeiten und NaNs korrekt:
Unten habe ich eine codierte Darstellung der Schaltung. Ich habe wenig Erfahrung damit, diese Art von Dingen zu kommentieren, daher weiß ich nicht genau, wie das normalerweise gemacht wird, aber jede Variable ist ein Boolescher Wert. Es ist also klar, dass er eine Schaltung beschreibt. Eine andere Sache, ich habe weder das Know-how noch wahrscheinlich die Hartnäckigkeit, um zu versuchen, ein Diagramm davon zu erstellen, aber wenn es eine einfach zu verwendende Software gibt, auf die jemand hinweisen möchte, wäre ich daran interessiert, einen Blick darauf zu werfen.
quelle
OR(AND(w,x),AND(y,z))
istNAND(NAND(w,x),NAND(y,z))
Spar 4, und Sie haben die erste Konstruktion ein paar Mal verwendet wird ; und Ihre NaN-Behandlung ist etwas falsch, weilInf + NaN
sollte seinNaN
.