Un minifloat es una representación binaria de un número de coma flotante que tiene muy pocos bits.
El minifloat en esta pregunta se definirá como un número de 6 bits m
, que tiene la siguiente representación:
1 bit para rechazar el signo del número. Este bit será
0
si el número es positivo y1
si el número es negativo.3 bits para representar el exponente del número, compensado por
3
(es decir, un exponente de110
realmente representa un factor de 2 3 , no 2 6 ).- Un exponente de se
000
refiere a un número subnormal. La mantisa se refiere a la parte fraccionaria de un número con una parte entera0
multiplicada por un factor del exponente más bajo posible (en este caso, 2 -2 ).
- Un exponente de se
2 bits para representar la mantisa del número. Si el exponente es distinto de
000
o111
, los 2 bits representan la parte fraccionaria después de a1
.- Un exponente de
111
representainfinity
si la mantisa es0
, yNaN
(no un número) de lo contrario.
- Un exponente de
En el artículo de Wikipedia, esto se denominaría minifloat (1.3.2.3).
Algunos ejemplos de la representación de este minifloat:
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
Su tarea es construir una red de compuertas NAND de dos entradas que tome 6 entradas que representan un minifloat a
y 6 entradas que representen un minifloat b
, y devuelva 6 salidas que representan el minifloat a + b
.
Su red debe agregar correctamente subnormals. Por ejemplo,
000001
+000010
debe ser igual000011
, y001001
+000010
=001010
.Su red debe sumar y restar infinitos correctamente. Cualquier cosa finita añadida a un infinito es el mismo infinito. Infinito positivo más infinito negativo es
NaN
.A
NaN
más cualquier cosa debe ser igual a aNaN
, aunque loNaN
que equivale depende de usted.La forma en que maneje la suma de cero positivo y cero negativo depende de usted, aunque cero más cero debe ser igual a cero.
Su red puede implementar cualquiera de las siguientes reglas de redondeo según la conveniencia:
- Redondear hacia abajo (hacia el infinito negativo)
- Redondear hacia arriba (hacia el infinito positivo)
- Redondear hacia cero
- Redondear lejos de cero
- Redondear al más cercano, con mitades redondeadas de acuerdo con cualquiera de las reglas anteriores
Para simplificar las cosas, puede usar las compuertas AND, OR, NOT y XOR en su diagrama, con los siguientes puntajes correspondientes:
NOT: 1
AND: 2
OR: 3
XOR: 4
Cada una de estas puntuaciones corresponde al número de puertas NAND que se necesitan para construir la puerta correspondiente.
El circuito lógico que utiliza la menor cantidad de compuertas NAND para implementar correctamente todos los requisitos anteriores gana.
fuente
Respuestas:
830 NANDs
Utiliza 24 NOT, 145 AND, 128 OR, 33 XOR. Siempre se redondea hacia cero, puede devolver -0 o +0 para valores cero, y creo que trata los infinitos y los NaN correctamente:
A continuación tengo una representación codificada del circuito. Tengo poca experiencia anotando este tipo de cosas, por lo que no sé cuál es la forma típica de hacerlo, pero cada variable es booleana, por lo que está claro que describe un circuito. Otra cosa, no tengo ni el conocimiento ni probablemente la tenacidad para intentar hacer un diagrama de esto, pero si hay algún software fácil de usar que alguien quiera señalar, me interesaría echar un vistazo.
fuente
OR(AND(w,x),AND(y,z))
estáNAND(NAND(w,x),NAND(y,z))
ahorrando 4, y has usado la primera construcción varias veces; y su tratamiento con NaN es ligeramente incorrecto porqueInf + NaN
debería serloNaN
.