Minifloat jest binarna reprezentacja liczby zmiennoprzecinkowej, że ma bardzo mało bitów.
Minifloat w tym pytaniu zostanie zdefiniowany jako liczba 6-bitowa m
, która ma następującą reprezentację:
1 bit, aby powtórzyć znak liczby. Ten bit będzie,
0
jeśli liczba jest dodatnia, a1
jeśli liczba jest ujemna.3 bity reprezentujące wykładnik liczby, przesunięty o
3
(tzn. Wykładnik110
faktycznie reprezentuje współczynnik 2 3 , a nie 2 6 ).- Wykładnik liczby
000
odnosi się do liczby nienormalnej. Mantysa odnosi się do części ułamkowej liczby z częścią całkowitą0
pomnożoną przez współczynnik najniższego możliwego wykładnika (w tym przypadku 2 -2 ).
- Wykładnik liczby
2 bity reprezentujące mantysę liczby. Jeśli wykładnik jest inny niż
000
lub111
, 2 bity reprezentują część ułamkową po a1
.- Wykładnik
111
reprezentuje,infinity
czy mantysa jest0
, iNaN
(nie jest liczbą) inaczej.
- Wykładnik
W artykule w Wikipedii byłoby to określane jako minifloat (1.3.2.3).
Kilka przykładów tego minifloata:
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
Twoim zadaniem jest zbudowanie sieci dwuwejściowych bramek NAND, która pobiera 6 danych wejściowych reprezentujących minifloat a
i 6 danych wejściowych minifloat b
i zwraca 6 wyników reprezentujących minifloat a + b
.
Twoja sieć musi poprawnie dodawać subnormalne. Na przykład
000001
+000010
musi być równy000011
, a001001
+000010
=001010
.Twoja sieć musi poprawnie dodawać i odejmować nieskończoności. Wszystko, co dodane do nieskończoności, jest tą samą nieskończonością. Dodatnia nieskończoność plus ujemna nieskończoność to
NaN
.NaN
Cokolwiek Plus musi być równaNaN
, chociaż któryNaN
to równa jest do ciebie.To, jak sobie poradzisz, dodając do siebie dodatnie zero i ujemne zero, zależy od ciebie, chociaż zero plus zero musi być równe zero.
Twoja sieć może wdrożyć dowolną z następujących zasad zaokrąglania w zależności od wygody:
- Zaokrąglaj w dół (w kierunku ujemnej nieskończoności)
- Zaokrąglaj w górę (w kierunku dodatniej nieskończoności)
- Zaokrąglić w kierunku zera
- Zaokrąglić od zera
- Zaokrąglaj do najbliższego, z połówkami zaokrąglonymi zgodnie z dowolną z powyższych zasad
Aby uprościć rzeczy, możesz użyć bramek AND, OR, NOT i XOR na diagramie z następującymi odpowiednimi wynikami:
NOT: 1
AND: 2
OR: 3
XOR: 4
Każda z tych ocen odpowiada liczbie bramek NAND potrzebnych do zbudowania odpowiedniej bramki.
Wygrywa obwód logiczny, który używa najmniejszej liczby bramek NAND do prawidłowego wdrożenia wszystkich powyższych wymagań.
źródło
Odpowiedzi:
830 NAND
Wykorzystuje 24 NOT, 145 AND, 128 OR, 33 XOR. Zawsze zaokrągla się do zera, może zwrócić albo 0, albo 0 dla wartości zerowych i uważam, że poprawnie traktuje Infinities i NaN:
Poniżej mam zakodowaną reprezentację obwodu. Mam niewielkie doświadczenie w opisywaniu tego typu rzeczy, więc tak naprawdę nie wiem, jaki jest typowy sposób, aby to zrobić, ale każda zmienna jest wartością logiczną, więc widać, że opisuje ona obwód. Inna sprawa, nie mam ani wiedzy, ani prawdopodobnie nieustępliwości, aby spróbować sporządzić schemat tego, ale jeśli istnieje jakieś łatwe w użyciu oprogramowanie, ktoś chciałby zwrócić uwagę, że byłbym zainteresowany.
źródło
OR(AND(w,x),AND(y,z))
jestNAND(NAND(w,x),NAND(y,z))
oszczędność 4 i użyłeś pierwsza konstrukcja kilka razy; a twoje leczenie NaN jest nieco niewłaściwe, ponieważInf + NaN
powinno byćNaN
.