Um minifloat é uma representação binária de um número de ponto flutuante que possui muito poucos bits.
O minifloat nesta pergunta será definido como um número de 6 bits m
, que possui a seguinte representação:
1 bit para representar o sinal do número. Este bit será
0
se o número for positivo e1
se o número for negativo.3 bits para representar o expoente do número, compensado por
3
(ou seja, um expoente de110
realmente representa um fator de 2 3 , não 2 6 ).- Um expoente de
000
refere-se a um número subnormal. A mantissa refere-se à parte fracionária de um número com uma parte inteira0
multiplicada por um fator do menor expoente possível (neste caso, 2 -2 ).
- Um expoente de
2 bits para representar a mantissa do número. Se o expoente for diferente de
000
ou111
, os 2 bits representam a parte fracionária após a1
.- Um expoente de
111
representainfinity
se a mantissa é0
eNaN
(não um número) de outra forma.
- Um expoente de
No artigo da Wikipedia, isso seria chamado de minifloat (1.3.2.3).
Alguns exemplos da representação deste 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
Sua tarefa é construir uma rede de portas NAND de duas entradas que recebam 6 entradas representando um minifloat a
e 6 entradas representando um minifloat b
e retornem 6 saídas representando o minifloat a + b
.
Sua rede deve adicionar corretamente subnormais. Por exemplo,
000001
+000010
deve ser igual000011
e001001
+000010
=001010
.Sua rede deve adicionar e subtrair infinitos corretamente. Qualquer coisa finita adicionada a um infinito é o mesmo infinito. Infinito positivo mais infinito negativo é
NaN
.Um
NaN
mais qualquer coisa deve ser igual aNaN
, emboraNaN
seja igual a você.Depende de você como você adiciona zero positivo e zero negativo um ao outro, embora zero mais zero deva ser igual a zero.
Sua rede pode implementar qualquer uma das seguintes regras de arredondamento, dependendo da conveniência:
- Arredondar para baixo (em direção ao infinito negativo)
- Arredondar para cima (em direção ao infinito positivo)
- Arredondar para zero
- Arredondar para zero
- Arredonde para o mais próximo, com as metades arredondadas de acordo com qualquer uma das regras acima
Para simplificar, você pode usar as portas AND, OR, NOT e XOR em seu diagrama, com as seguintes pontuações correspondentes:
NOT: 1
AND: 2
OR: 3
XOR: 4
Cada uma dessas pontuações corresponde ao número de portas NAND necessárias para construir a porta correspondente.
O circuito lógico que usa o menor número de portas NAND para implementar corretamente todos os requisitos acima vence.