Un minifloat est une représentation binaire d'un nombre à virgule flottante qui a très peu de bits.
Le flotteur dans cette question sera défini comme un nombre à 6 bits m
, qui a la représentation suivante:
1 bit pour représenter le signe du nombre. Ce bit sera
0
si le nombre est positif et1
si le nombre est négatif.3 bits pour représenter l'exposant du nombre, compensé par
3
(c.-à-d. Un exposant de110
représente en fait un facteur de 2 3 , pas 2 6 ).- Un exposant de
000
fait référence à un nombre sous-normal. La mantisse fait référence à la partie fractionnaire d'un nombre dont la partie entière est0
multipliée par un facteur de l'exposant le plus bas possible (dans ce cas, 2 -2 ).
- Un exposant de
2 bits pour représenter la mantisse du nombre. Si l'exposant est autre chose que
000
ou111
, les 2 bits représentent la partie fractionnaire après a1
.- Un exposant de
111
représenteinfinity
si la mantisse est0
, etNaN
(pas un nombre) sinon.
- Un exposant de
Dans l'article de Wikipédia, cela serait appelé (1.3.2.3) mini-flotteur.
Quelques exemples de la représentation de ce mini flotteur:
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
Votre tâche consiste à créer un réseau de portes NAND à deux entrées qui prend 6 entrées représentant un minifloat a
et 6 entrées représentant un minifloat b
, et renvoie 6 sorties représentant le minifloat a + b
.
Votre réseau doit ajouter correctement des sous-normales. Par exemple,
000001
+000010
doit être égal000011
et001001
+000010
=001010
.Votre réseau doit ajouter et soustraire correctement les infinis. Tout ce qui est fini ajouté à un infini est le même infini. L'infini positif plus l'infini négatif est
NaN
.Un
NaN
plus n'importe quoi doit être égal à unNaN
, bienNaN
qu'il équivaut à vous.La façon dont vous gérez l'ajout de zéro positif et de zéro négatif dépend de vous, bien que zéro plus zéro doit être égal à zéro.
Votre réseau peut appliquer l'une des règles d'arrondi suivantes en fonction de la commodité:
- Arrondir vers le bas (vers l'infini négatif)
- Arrondir (vers l'infini positif)
- Arrondir vers zéro
- Arrondir à zéro
- Arrondir au plus proche, avec des moitiés arrondies selon l'une des règles ci-dessus
Pour simplifier les choses, vous pouvez utiliser les portes AND, OR, NOT et XOR dans votre diagramme, avec les scores correspondants suivants:
NOT: 1
AND: 2
OR: 3
XOR: 4
Chacun de ces scores correspond au nombre de portes NAND qu'il faut pour construire la porte correspondante.
Le circuit logique qui utilise le moins de portes NAND pour implémenter correctement toutes les exigences ci-dessus gagne.
la source
Réponses:
830 NAND
Il utilise 24 NOTs, 145 ANDs, 128 ORs, 33 XORs. Il arrondit toujours vers zéro, il peut retourner soit -0 soit +0 pour les valeurs nulles, et je crois qu'il traite correctement les infinités et les NaN:
Ci-dessous, j'ai une représentation codée du circuit. J'ai peu d'expérience pour annoter ce type de choses, donc je ne sais pas vraiment quelle est la façon typique de faire cela, mais chaque variable est un booléen, il est donc clair de voir qu'elle décrit un circuit. Autre chose, je n'ai ni le savoir-faire ni probablement la ténacité d'essayer de faire un diagramme de cela, mais s'il y a un logiciel facile à utiliser là-bas, quelqu'un veut le souligner, je serais intéressé à y jeter un œil.
la source
OR(AND(w,x),AND(y,z))
estNAND(NAND(w,x),NAND(y,z))
économiser 4, et vous avez utilisé la première construction à quelques reprises; et votre traitement au NaN est légèrement faux parce qu'ilInf + NaN
devrait l'êtreNaN
.