Una minifloat è una rappresentazione binaria di un numero in virgola mobile che ha pochissimi bit.
Il minifloat in questa domanda sarà definito come un numero a 6 bit m
, che ha la seguente rappresentazione:
1 bit per rispondere al segno del numero. Questo bit sarà
0
se il numero è positivo e1
se il numero è negativo.3 bit per rappresentare l'esponente del numero, sfalsato di
3
(ovvero un esponente di110
rappresenta in realtà un fattore di 2 3 , non di 2 6 ).- Un esponente di si
000
riferisce a un numero subnormale. La mantissa si riferisce alla parte frazionaria di un numero con una parte intera0
moltiplicata per un fattore dell'esponente più basso possibile (in questo caso, 2 -2 ).
- Un esponente di si
2 bit per rappresentare la mantissa del numero. Se l'esponente è diverso da
000
o111
, i 2 bit rappresentano la parte frazionaria dopo a1
.- Un esponente di
111
rappresentainfinity
se la mantissa è0
, eNaN
(non un numero) altrimenti.
- Un esponente di
Nell'articolo di Wikipedia, questo sarebbe indicato come (1.3.2.3) minifloat.
Alcuni esempi della rappresentazione di questo 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
Il tuo compito è costruire una rete di porte NAND a due ingressi che accetta 6 ingressi che rappresentano una minifloat a
e 6 ingressi che rappresentano una minifloat b
e restituisce 6 uscite che rappresentano la minifloat a + b
.
La tua rete deve aggiungere correttamente subnormali. Ad esempio,
000001
+000010
deve essere uguale000011
e001001
+000010
=001010
.La tua rete deve aggiungere e sottrarre correttamente gli infiniti. Qualsiasi cosa finita aggiunta a un infinito è lo stesso infinito. L'infinito positivo più l'infinito negativo è
NaN
.Un
NaN
plus qualsiasi cosa deve essere uguale a aNaN
, sebbene ciòNaN
che equivale a te.Il modo in cui gestisci l'aggiunta di zero positivo e zero negativo l'uno all'altro dipende da te, anche se zero più zero deve essere uguale a zero.
La rete può implementare una delle seguenti regole di arrotondamento a seconda della convenienza:
- Arrotondare per difetto (verso l'infinito negativo)
- Arrotondare (verso l'infinito positivo)
- Arrotonda verso zero
- Arrotondare da zero
- Arrotondare al più vicino, con metà arrotondata secondo una delle regole sopra
Per semplificare le cose, puoi usare le porte AND, OR, NOT e XOR nel diagramma, con i seguenti punteggi corrispondenti:
NOT: 1
AND: 2
OR: 3
XOR: 4
Ognuno di questi punteggi corrisponde al numero di porte NAND necessarie per costruire la porta corrispondente.
Vince il circuito logico che utilizza il minor numero di gate NAND per implementare correttamente tutti i requisiti di cui sopra.