Sebuah minifloat adalah representasi biner dari angka floating-point yang memiliki sangat sedikit bit.
Minifloat dalam pertanyaan ini akan didefinisikan sebagai angka 6-bit m
, yang memiliki representasi berikut:
1 bit untuk merepresentasikan tanda nomor. Bit ini akan menjadi
0
jika jumlahnya positif, dan1
jika jumlahnya negatif.3 bit untuk mewakili eksponen angka, diimbangi oleh
3
(yaitu eksponen110
sebenarnya mewakili faktor 2 3 , bukan 2 6 ).- Eksponen
000
mengacu pada angka subnormal. Mantera mengacu pada bagian fraksional dari bilangan dengan bagian bilangan bulat0
dikalikan dengan faktor eksponen serendah mungkin (dalam hal ini, 2 -2 ).
- Eksponen
2 bit untuk mewakili mantissa nomor tersebut. Jika eksponen adalah selain dari
000
atau111
, 2 bit mewakili bagian pecahan setelah a1
.- Eksponen
111
mewakiliinfinity
jika mantissa adalah0
, danNaN
(bukan angka) sebaliknya.
- Eksponen
Dalam artikel Wikipedia, ini akan disebut sebagai minifloat (1.3.2.3).
Beberapa contoh representasi minifloat ini:
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
Tugas Anda adalah membangun jaringan gerbang NAND dua input yang mengambil 6 input mewakili minifloat a
dan 6 input mewakili minifloat b
, dan mengembalikan 6 output yang mewakili minifloat a + b
.
Jaringan Anda harus menambahkan subnormal dengan benar. Misalnya,
000001
+000010
harus sama000011
, dan001001
+000010
=001010
.Jaringan Anda harus menambah dan mengurangi infinitas dengan benar. Hingga apa pun yang ditambahkan ke tak terhingga adalah tak terhingga yang sama. Tak terhingga positif plus tak terhingga negatif
NaN
.Nilai
NaN
tambah apa pun harus sama denganNaN
, meskipunNaN
sama dengan Anda.Bagaimana Anda menangani penambahan nol positif dan nol negatif satu sama lain terserah Anda, meskipun nol plus nol harus sama dengan nol.
Jaringan Anda dapat menerapkan aturan pembulatan berikut yang tergantung pada kenyamanan:
- Round down (menuju infinity negatif)
- Mengumpulkan (menuju infinity positif)
- Bulat menuju nol
- Membulatkan dari nol
- Bulat ke terdekat, dengan setengah dibulatkan sesuai dengan salah satu aturan di atas
Untuk menyederhanakan hal-hal, Anda dapat menggunakan gerbang AND, ATAU, TIDAK, dan XOR dalam diagram Anda, dengan skor terkait berikut:
NOT: 1
AND: 2
OR: 3
XOR: 4
Masing-masing skor ini sesuai dengan jumlah gerbang NAND yang diperlukan untuk membangun gerbang yang sesuai.
Sirkuit logika yang menggunakan gerbang NAND paling sedikit untuk mengimplementasikan semua persyaratan di atas dengan benar akan menang.
sumber
Jawaban:
830 NANDs
Ini menggunakan 24 TIDAK, 145 AND, 128 OR, 33 XOR. Itu selalu membulat ke nol, mungkin mengembalikan -0 atau +0 untuk nilai nol, dan saya percaya itu memperlakukan Infinities dan NaNs dengan benar:
Di bawah ini saya memiliki representasi kode dari sirkuit. Saya memiliki sedikit pengalaman dalam menjelaskan hal-hal semacam ini, jadi saya tidak benar-benar tahu apa cara khas untuk melakukan ini, tetapi setiap variabel adalah Boolean sehingga jelas untuk melihat bahwa itu menggambarkan sebuah rangkaian. Hal lain, saya tidak memiliki pengetahuan atau keuletan untuk mencoba dan membuat diagram ini, tetapi jika ada perangkat lunak yang mudah digunakan di luar sana, ada yang ingin menunjukkan, saya akan tertarik untuk melihatnya.
sumber
OR(AND(w,x),AND(y,z))
adalahNAND(NAND(w,x),NAND(y,z))
tabungan 4, dan Anda telah menggunakan konstruksi pertama beberapa kali; dan pengobatan NaN Anda sedikit salah karenaInf + NaN
seharusnyaNaN
.