Bagaimana pembagian terjadi di komputer kita?


17

Bagaimana pembagian terjadi di dalam komputer digital? Apa algoritma untuk itu?

Saya telah mencari dengan keras di google tetapi belum mendapatkan hasil yang memuaskan. Harap berikan sangat jelas algoritma / flowchart untuk algoritma pembagian dengan ilustrasi sampel.


1
@ Program-o-steve Divisi dalam ALU adalah operasi yang kompleks. Anda tidak akan mendapatkan "sederhana" flowchart.
Majenko

5
@ Leon Heller Oh! Tidak dikatakan demikian. Ini adalah pertanyaan perangkat keras murni
program-o-steve

2
@ Leon Heller saya kira itu tidak ...., yang mencakup elektronik, komputasi fisik ...
Program-o-steve

2
Divisi dalam mikrokontroler tidak lurus ke depan. Ada cara cepat dan lambat untuk melakukannya. Cara lambat lebih mudah untuk memahami tetapi cara cepat yang digunakan dalam CPU modern apa khusus yang Anda ingin tahu tentang? Apakah Anda hanya ingin pemahaman dasar tentang prinsip-prinsip atau analisis rinci dari CPU modern?
Konsalik

4
@LeonHeller Saya biasanya setuju dengan pertanyaan yang ingin ditutup, tapi desain CPU sangat banyak pertanyaan teknik listrik. Pertanyaan ini bisa menggunakan beberapa bantuan untuk membuatnya lebih jelas tentang apa yang ingin (seperti apa konsalik bertanya tentang) tapi itu tidak membuatnya luar topik.
Kellenjb

Jawaban:


17

algoritma divisi dalam desain digital dapat dibagi menjadi dua kategori utama. divisi lambat dan divisi cepat.

Saya sarankan Anda membaca tentang bagaimana biner penambahan dan pengurangan pekerjaan jika Anda belum terbiasa dengan konsep-konsep ini.

Divisi lambat

Metode lambat sederhana semua pekerjaan dengan cara berikut: Kurangi denominator dari pembilang. Lakukan ini secara rekursif dengan hasil masing-masing pengurangan sampai sisanya kurang dari penyebut. Jumlah iterasi adalah hasil bagi bilangan bulat, dan jumlah yang tersisa adalah sisanya.

Contoh:

7/3:

  1. 7-3=4
  2. 4-3=1
  3. 1<3

Jadi jawabannya adalah 2 dengan sisa 1. Untuk membuat jawaban ini sedikit lebih relevan, di sini adalah beberapa latar belakang. pengurangan biner melalui penambahan negatif dilakukan misalnya: 7-3 = 7 + (-3). Hal ini dicapai dengan menggunakan komplemen dua nya. Setiap angka biner ditambahkan menggunakan serangkaian penambah penuh:

masukkan deskripsi gambar di sini

Di mana setiap 1-bit penambah penuh akan dilaksanakan sebagai berikut:

masukkan deskripsi gambar di sini

Divisi cepat

Sedangkan metode lebih lambat dari divisi mudah dimengerti, membutuhkan iterasi berulang-ulang. Ada ada berbagai "cepat" algoritma, tetapi mereka semua bergantung pada estimasi.

Mempertimbangkan metode Goldschmidt:

Saya akan menggunakan yang berikut ini:

Q=ND

Metode ini berfungsi sebagai berikut:

  1. Multiply N dan D dengan fraksi F sedemikian rupa bahwa D mendekati 1.
  2. Ketika D mendekati 1, N mendekati Q

Metode ini menggunakan perkalian biner melalui penambahan berulang, yang juga digunakan di zaman modern AMD CPU.


1
Beberapa diagram alur untuk variasi pada metode 'lambat' (diimplementasikan dalam perakitan pada mikro tanpa membagi hardware, tetapi masih membantu) diberikan dalam Atmel AVR200 appnote.
Kevin Vermeer

tolong bisa memberikan gambaran tentang metode Goldschmidt divisi. Juga diagram alur yang diberikan di sini adalah contoh dari divisi lambat?
Program-o-steve

apa itu metode di mana kita harus berulang kali menggeser dividen ke kiri?
Program-o-steve

@ program-o-steve Berikut ini adalah ilustrasi singkat: find 22/7 (pi approximation). Pertama, atas kalikan dan bawah 0,1 untuk mendapatkan: 2,2 / 0,7 Multiply lagi, menggunakan 1.3, memberikan: 2,86 / 0,91 Menggunakan 1,09 memberikan: 3,1174 / 0,9919 1,008 memberikan: 3,1423393 / 0,9998352 Terus pergi, Anda akan segera mencapai FINAL JAWABAN 3,1428571 / 1,000000 ...
Alan Campbell

Bagaimana Anda "mengalikan dengan pecahan"? Pecahan tidak dapat diwakili dalam floating point. Sebuah fraksi dengan definisi yang pembilang dibagi dengan penyebut, sehingga Anda yang tersisa dalam argumen melingkar masih harus membagi. Dan bagaimana orang memperkirakan fraksi itu?
CogitoErgoCogitoSum

4

Hardware untuk divisi floating point merupakan bagian dari unit logika yang juga melakukan perkalian; ada modul hardware multiplier yang tersedia. Angka floating point, mengatakan A dan B, dibagi (membentuk A / B) oleh

  1. membusuk angka floating point ke tanda (+1 atau -1), mantissa ( "a" dan "b", dan (binary tipe integer) eksponen
  2. tanda hasilnya adalah (1) jika dan hanya jika keduanya tanda-tanda yang sama, lain (-1)
  3. eksponen dikurangi (eksponen B dikurangkan dari eksponen A) untuk membentuk eksponen hasilnya
  4. Mantisa (biner digit nomor) adalah bilangan biner fixed-point antara 1/2 dan 1; itu berarti bahwa digit pertama setelah titik biner adalah '1', diikuti oleh nol dan satu ... sebagai langkah pertama, tabel pencarian menemukan timbal balik akurat hingga enam bit (hanya ada 32 kemungkinan, ini adalah meja kecil)

  5. Sebuahb=SebuahrecsayahalrHaicSebuahl(b)brecsayahalrHaicSebuahl(b)

  6. d==1+ε
    d(2-d)=(1+ε)×(1-ε)=1-ε2
    Ini menyiratkan bahwa 'satu' akurat lima bit kami dalam penyebut akan menjadi sepuluh bit akurat setelah satu pasang perkalian lagi, dua puluh bit akurat setelah dua, dan empat puluh bit akurat setelah tiga. Lakukan seperti banyak iterasi dari mengalikan pembilang dan penyebut oleh (2 - denominator) sebagai hasilnya presisi Anda membutuhkan.
  7. pembilang, sekarang penyebut adalah persis '1', adalah mantissa dari hasil, dan dapat dikombinasikan dengan tanda sebelumnya dihitung dan eksponen.
  8. IEEE floating point memungkinkan beberapa pengecualian (nomor denormalized, NAN, mereka harus ditangani oleh operasi logis lainnya.

Menariknya, bug pembagian Pentium lama (sangat bernilai berita pada tahun 1994) disebabkan oleh kesalahan pencetakan yang membuat nilai tabel timbal balik yang salah untuk langkah (4). Kertas awal, "Sebuah Metode Divisi Menggunakan Multplier Paralel", Domenico Ferrari, IEEE Trans. Elektron. Comput. EC-16 / 224-228 (1967), menjelaskan metode ini, seperti halnya "Sistem IBM / Model 360 91: Unit Eksekusi Floating-Point" IBM J. Res. Dev. 11 : 34-53 (1967).


1

Ada beberapa metode yang sangat berbeda untuk divisi, tergantung pada nomor yang akan ditangani. Untuk bilangan bulat, metode shift-dan-kurangi diberikan oleh orang lain akan bekerja dengan baik. Untuk angka floating point, bagaimanapun, mungkin lebih cepat untuk menghitung pertama kebalikan dari penyebut dan kemudian kalikan bahwa kali pembilang Anda.

Perhitungan kebalikan dari penyebut tidak begitu buruk; ini dilakukan dengan menyempurnakan pendekatan yang berurutan. Biarkan g menjadi tebakan Anda untuk 1 / d. Untuk perkiraan yang lebih baik, gunakan g '= g (2-gd). Ini menyatu secara kuadrat, sehingga Anda menggandakan digit presisi pada setiap peningkatan.

Contoh: hitung kebalikan dari 3,5.

Tebakan awal Anda adalah 0,3. Anda menghitung 0,3 * 3,5 = 1,15. Dugaan Anda disesuaikan adalah 0,3 * (2-1,15) = 0,285. Sudah cukup dekat! Ulangi proses, dan Anda mendapatkan 0.2857125, dan ketiga mencoba mendapat ,2857142857.

Ada beberapa jalan pintas. Dalam floating point, Anda dapat mengekstrak kekuatan sepuluh atau kekuatan dari dua, tergantung pada dasar jumlah mesin Anda. Dan, untuk kecepatan dengan mengorbankan penggunaan memori yang lebih besar, Anda dapat menggunakan tabel pra-dihitung untuk angka dalam kisaran 1 sampai b (di mana b adalah bilangan basis Anda) untuk mendapatkan menebak bahwa segera dekat dengan yang dibutuhkan timbal balik dan simpan satu atau dua langkah penyempurnaan.

Perlu diingat bahwa, seperti dengan perkalian dan Kolmogorov 1960 malu oleh muridnya Anatoly Karatsuba, Anda tidak pernah tahu kapan metode yang lebih cepat atau lebih baik akan ditemukan. Jangan pernah menyerahkan rasa ingin tahu Anda.


-1

Komputer tidak melakukan penambahan berulang ke nomor kalikan - itu akan sangat lambat. Sebagai gantinya, ada beberapa algoritma multiplikasi cepat. Periksa: http://en.wikipedia.org/wiki/Karatsuba_algorithm


Selamat Datang di EE.SE. Jawaban hanya tautan tidak disarankan. Harap rangkum informasi dalam tautan.
Null

Mereka melakukan. Ton CPU masih tidak memiliki satu siklus pengganda dan menggunakan perangkat lunak mutiplication.
user3528438
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.