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.
fonte
Respostas:
830 NANDs
Ele usa 24 NOTs, 145 ANDs , 128 ORs, 33 XORs. Sempre arredonda para zero, pode retornar -0 ou +0 para valores zero, e acredito que trate Infinities e NaNs corretamente:
Abaixo, tenho uma representação codificada do circuito. Tenho pouca experiência em anotar esses tipos de coisas, então não sei realmente qual é a maneira típica de fazer isso, mas como cada variável é um booleano, fica claro que ele descreve um circuito. Outra coisa: não tenho o conhecimento nem a tenacidade de tentar fazer um diagrama disso, mas se houver algum software fácil de usar por aí, alguém quer salientar que eu estaria interessado em dar uma olhada.
fonte
OR(AND(w,x),AND(y,z))
estáNAND(NAND(w,x),NAND(y,z))
salvando 4 e você usou a primeira construção algumas vezes; e seu tratamento com NaN está levemente errado, porqueInf + NaN
deveria estarNaN
.