Mengapa representasi floating point menggunakan bit tanda alih-alih pelengkap 2 untuk menunjukkan angka negatif

20

Pertimbangkan representasi titik tetap yang dapat dianggap sebagai kasus degenerasi angka mengambang. Sangat mungkin untuk menggunakan komplemen 2 untuk angka negatif. Tetapi mengapa bit tanda diperlukan untuk angka floating point, bukankah seharusnya bit mantissa menggunakan komplemen 2's?

Juga mengapa bit eksponen menggunakan bias alih-alih representasi bertanda-besaran (mirip dengan bit mantissa) atau representasi komplemen 2's?

Pembaruan: Maaf jika saya tidak menjelaskannya. Saya mencari alasan bagaimana representasi floating point dibentuk. Jika tidak ada trade-off implementasi yang kuat antara alternatif, maka dapatkah seseorang menjelaskan aspek historis dari representasi floating point?

koo
sumber

Jawaban:

7

Dua komplemen masuk akal ketika dua entitas yang dimaksud memiliki "satuan" dan "lebar" yang sama. Lebar maksud saya, katakanlah, jika Anda menambahkan nomor bit N dan nomor bit M, di mana N dan M berbeda, maka Anda lebih baik tidak menggunakan komplemen dua. Untuk angka floating point, kami memiliki masalah unit: jika eksponen berbeda, maka kami secara mental memindahkan salah satu mantra, dan sekarang kami berada di masalah yang sama seperti sebelumnya (dengan lebar).

Adapun bit eksponen, dengan menggunakan bias, bukan tanda + besarnya kita mendapatkan satu nilai lagi (kalau tidak kita akan memiliki +0 dan -0). Di sini dua komplemen masuk akal ketika mengalikan atau membagi angka (sejak saat itu kami menambah atau mengurangi eksponen), tetapi tidak terlalu masuk akal ketika menambah atau mengurangi.

Sunting: Seorang komentator berkomentar bahwa Anda dapat menambahkan bilangan bulat pelengkap dua dengan panjang yang berbeda menggunakan ekstensi tanda. Ada juga beberapa masalah dengan mendeteksi overflow, tetapi itu juga bisa diperbaiki. Singkatnya, Anda mungkin bisa menggunakan komplemen dua, jika Anda cukup hati-hati. (Anda juga perlu menangani perkalian dan pembagian.)

Yuval Filmus
sumber
4
"Jika Anda menambahkan nomor bit N dan nomor bit M, di mana N dan M berbeda, maka Anda sebaiknya tidak menggunakan komplemen dua" - Bisakah Anda menjelaskan sedikit? Saya percaya sepenuhnya dimungkinkan untuk menandatangani perluasan nomor menggunakan representasi komplemen 2 menggunakan MSB-nya, misalnya 4'b1111 akan diperluas ke 5'b11111, dan 4'b0111 -> 5'b00111. Tidakkah seharusnya langsung menambahkan ini ke barrel shifter yang ada dalam logika aritmatika floating point?
koo
Terima kasih atas jawaban Anda! Saya telah mengedit pertanyaan sehingga ia bertanya lebih jelas tentang apa yang membuat titik mengambang saat ini.
koo
4

Dari Wikipedia:

Sistem dua-pelengkap memiliki keuntungan bahwa operasi aritmatika dasar penjumlahan, pengurangan, dan penggandaan identik dengan yang untuk bilangan biner tanpa tanda ...

Two's-melengkapi adalah representasi dari angka negatif yang kebetulan sangat nyaman. Itulah alasan utama untuk menggunakannya sama sekali.

Pasangan mantissa-eksponen adalah representasi dari angka floating point. Sebagian besar waktu ketika menggunakan angka floating point, Anda tidak melakukan aritmatika semata-mata pada mantissa atau hanya pada eksponen.

Kache
sumber
4

Tetapi mengapa tanda sedikit diperlukan untuk angka floating point

Anggapan yang salah. Itu tidak perlu. Saya cukup yakin saya telah bertemu format floating point yang menggunakan komplemen 2's untuk mantissa, tetapi saya harus menggali untuk nama.

Saya jauh dari spesialis dalam analisis numerik, tetapi saya mendapatkan bahwa menandatangani nol penting bagi mereka. Mungkin lebih mudah untuk memanipulasi daripada komplemen. Itu mungkin kriteria dalam pilihan untuk IEEE-754.

Juga mengapa bit eksponen menggunakan bias alih-alih representasi magnitudo yang ditandatangani

Sekali lagi itu adalah sesuatu yang tidak diperlukan dan beberapa telah melakukan hal yang berbeda.

Ini representasi yang lebih mudah untuk melakukan implementasi perangkat keras untuk serangkaian operasi yang dilakukan pada eksponen (dan di sini memiliki representasi untuk -0 tidak diinginkan).

Salah satu konsekuensi dari pilihan itu adalah bahwa Anda dapat menggunakan perbandingan bilangan bulat yang ditandatangani untuk membandingkan nomor FP jika Anda tidak peduli dengan NaN, yang mungkin merupakan kriteria untuk beberapa (fakta daripada NaN membutuhkan penanganan khusus membuat saya ragu itu bukan untuk IEEE-754).

Pemrogram
sumber
Perbandingan bilangan bulat yang ditandatangani akan memberi peringkat nomor FP negatif ke belakang. Bagi mereka untuk memberi peringkat dengan benar, beberapa jenis format komplemen akan diperlukan, dengan komplemen yang mungkin menjadi yang terbaik (negatif adalah ... 110.1111 ..., dengan yang tak terbatas ke kiri dan kanan).
supercat
3
MIL-STD-1750A mungkin adalah arsitektur prosesor yang paling banyak digunakan yang menentukan representasi floating-point pelengkap dua itu. Pada bagian 4.1: "Set instruksi harus mendukung presisi titik tunggal 16-bit, presisi ganda titik tetap 32-bit, titik mengambang 32-bit dan data presisi diperpanjang titik mengambang 48-bit dalam representasi komplemen 2's. " (Penekanan tambang) .
njuffa
2

IEEE 754 menggunakan tanda / besarnya, bukan komplemen dua atau komplemen seseorang.

Pelengkap dua memiliki kelemahan bahwa rentang positif dan negatif tidak identik. Jika semua pola bit valid, maka Anda memiliki angka x di mana Anda tidak dapat dengan mudah menghitung -x. Itu buruk. Alternatifnya adalah bahwa ada pola bit yang tidak valid, yang juga buruk. Di IEEE 754 tidak ada pola bit yang tidak valid untuk floating point 64 atau 32 bit, jadi Anda tidak perlu khawatir tentang itu.

Pelengkap seseorang akan membuat penggandaan / pembagian menjadi lebih kompleks (dengan magnitudo yang ditandatangani, Anda cukup menandai atau memperlakukan mantissa sebagai angka yang tidak ditandatangani). Untuk menambah dan mengurangi, saya benar-benar tidak ingin memikirkan menambah dan mengurangi komplemen seseorang, itu membuat kepala saya sakit.

gnasher729
sumber
Paragraf pertama jawaban ini menunjukkan bahwa tidak ada kekurangan untuk ditandatangani / besarnya. Tanda / magnitudo memiliki +/- 0 dan aritmatika lebih rumit daripada komplemen dua's.
Praxeolitic
Memiliki +/- nol adalah masalah dan fitur. Sebagai contoh, membagi angka kecil x dengan 10 ^ 100 akan menghasilkan +0 atau -0, menjaga tanda x.
gnasher729
1

Nol yang ditandatangani memberi peningkatan ekspresif yang mungkin berguna dalam perhitungan numerik. Halaman wikipedia ' Masuk nol ' mengatakan:

Dikatakan bahwa dimasukkannya nol yang ditandatangani di IEEE 754 membuatnya lebih mudah untuk mencapai akurasi numerik dalam beberapa masalah kritis , khususnya ketika komputasi dengan fungsi-fungsi dasar yang kompleks .

Salah satu desainer utama IEEE 754 floating point, WH Kahan adalah pendukung nol yang ditandatangani karena alasan ini. Pendapatnya kemungkinan akan membawa banyak bobot.

Equaeghe
sumber
1

Saya pikir penting untuk memahami bahwa perhitungan floating-point menghasilkan nilai perkiraan , bukan nilai yang tepat . Yaitu, jika perhitungan titik-mengambang menghasilkan nilai yang dikodekan X, maka ini mewakili nilai ideal secara teoritis yang hampir pasti BUKAN X, tetapi berada dalam kisaran [X .. X + e) ​​{di mana 'e' adalah ' mesin epsilon ', yaitu tidak ada angka titik-mengambang antara X dan X + e}. Lebih khusus lagi, titik-mengambang nol mewakili angka ideal yang mungkin tidak tepat nol, tetapi yang terlalu kecil untuk diwakili dengan nilai dikodekan titik mengambang-nol.

Mengingat bahwa, menggunakan representasi tanda-dan-magnitudo adalah cara yang memungkinkan pengkodean untuk 'mengingat' di sisi nol mana nilai ideal berada, positif atau negatif. Ini sangat penting dalam perhitungan kompleks tertentu (dalam arti 'a + bi') - fungsi kompleks-> seringkali 'bernilai banyak', jadi untuk perhitungan yang tepat sangat penting untuk memperhatikan lokasi 'pemotongan cabang'. Nol yang ditandatangani kemudian dalam arti menandai lokasi pemotongan cabang ini - perhitungan yang dilakukan pada sisi positif akan berbeda dari yang di sisi negatif.

PMar
sumber
1
Perhitungan floating-point menghasilkan nilai yang tepat . Mereka hanya sedikit berbeda dari nilai-nilai yang dihasilkan bilangan real matematika. Angka floating point mewakili satu angka, bukan rentang.
gnasher729
0

Sebagian besar format floating-point mengambil keuntungan dari kenyataan bahwa, dalam sistem biner, nilai non-nol dengan eksponen non-minimum akan memiliki "1" sebagai bit paling signifikan dari mantissa. Jadi, dalam sistem dengan bidang 23-bit untuk mantissa, mantra angka positif tidak berkisar dari 0 hingga 8.388.607 tetapi sebaliknya dari 8.388.608 hingga 16.777.215. Mantra angka yang mungkin atau mungkin tidak berkisar antara -16.777.215 hingga -8.388.608 dan dari +8.388.608 hingga +16.777.215. Sementara dua komplemen adalah format numerik terbaik ketika diperlukan untuk memiliki perhitungan "lancar" melintasi nol, rentang terputus dari nilai mantissa berarti bahwa perhitungan tidak akan dapat beroperasi dengan lancar di nol apakah mereka menggunakan komplemen dua atau yang lain .

supercat
sumber