Bilgisayarlarımızda bölünme nasıl olur?


17

Dijital bilgisayarlarda bölünme nasıl gerçekleşir? Bunun için algoritma nedir?

Google'da çok araştırdım, ancak tatmin edici sonuçlar almadım. Lütfen örnek bir resme sahip bölme algoritması için çok açık bir algoritma / akış şeması sağlayın .


1
@ program-o-steve Bir ALU'da bölüm karmaşık bir işlemdir. "Basit" bir akış şeması elde edemezsiniz.
Majenko

5
@ Leon Heller Oh! Öyle değil Bu saf bir donanım sorusu
program-o-steve

2
@ Leon Heller Sanırım değil ...., elektronik, fiziksel bilgi işlem dahil ...
program-o-steve

2
Mikrodenetleyicilerdeki bölüm doğrudan ileri değildir. Bunu yapmanın hızlı ve yavaş yolları vardır. Yavaş yolların anlaşılması daha kolaydır, ancak modern CPU'larda hızlı yollar kullanılır, özellikle ne hakkında bilmek istersiniz? Sadece modern CPU'ların prensiplerini veya ayrıntılı bir analizini anlamak mı istiyorsunuz?
Konsalik

4
@LeonHeller Genellikle kapalı olmasını istediğiniz soruları kabul ediyorum, ancak CPU tasarımı bir elektrik mühendisliği sorusudur. Bu soru, (konsalik'in ne istediği gibi) neyin istendiğini daha açık hale getirmek için biraz yardım kullanabilir, ancak bu konu dışı değildir.
Kellenjb

Yanıtlar:


17

Dijital tasarımlarda bölüm algoritmaları iki ana kategoriye ayrılabilir. Yavaş bölme ve hızlı bölme.

Bu kavramlara henüz aşina değilseniz ikili toplama ve çıkarma işlemlerinin nasıl çalıştığını okumanızı öneririm.

Yavaş Bölüm

En basit yavaş yöntemlerin tümü şu şekilde çalışır: Paydayı paydan çıkarın. Kalan paydadan daha az olana kadar her çıkartmanın sonucu ile bunu tekrarlayın. Yineleme miktarı tamsayı bölümüdür ve kalan miktar kalanıdır.

Misal:

03/07:

  1. 73=4
  2. 43=1
  3. 1<3

Böylece cevap 2'dir ve geri kalanı 1'dir. Bu cevabı biraz daha alakalı hale getirmek için, bazı arka plan. Negatif eklenerek ikili çıkarma yapılır, örneğin: 7 - 3 = 7 + (-3). Bu, ikisinin tamamlayıcısı kullanılarak gerçekleştirilir. Her ikili sayı bir dizi tam toplayıcı kullanılarak eklenir:

resim açıklamasını buraya girin

Her 1 bitlik tam toplayıcının aşağıdaki gibi uygulandığı yerlerde:

resim açıklamasını buraya girin

Hızlı Bölüm

Daha yavaş bölme yöntemini anlamak kolay olsa da, tekrarlayan yinelemeler gerektirir. Çeşitli "hızlı" algoritmalar vardır, ancak hepsi tahmine dayanır.

Goldschmidt yöntemini düşünün:

Aşağıdakilerden faydalanacağım:

Q=ND

Bu yöntem aşağıdaki gibi çalışır:

  1. N ve D'yi, D 1'e yaklaşacak şekilde F kesiri ile çarpın.
  2. D 1'e yaklaştıkça N, Q'ya yaklaşır

Bu yöntem, modern AMD CPU'larda da kullanılan yinelemeli toplama yoluyla ikili çarpmayı kullanır.


1
Atmel'in AVR200 uygulamasında 'yavaş' yöntemdeki varyasyonlar için bazı akış şemaları (donanım bölmesi olmadan mikroskoblarda montajda uygulanır , ancak yine de yardımcı olur) verilir .
Kevin Vermeer

Goldschmidt bölme yöntemi hakkında bir örnek verebilir misiniz ? Ayrıca burada verilen akış şeması yavaş bölünme örneğidir?
program-o-steve

temettüyü tekrar tekrar sola kaydırmamız gereken yöntem nedir?
program-o-steve

@ program-o-steve İşte kısa bir örnek: 22/7 bul (pi yaklaşımı). İlk olarak, üst ve alt kısımları elde etmek için 0,1 ile çarpın: 2,2 / 0,7 Tekrar kullanarak 1,3 kullanarak çarpın: 2,86 / 0,91 1,09 kullanarak verir: 3,1174 / 0,9919 1,008 verir: 3,1423393 / 0,9998352 Devam ederseniz, yakında FINAL ANSWER 3.1428571 / 1.000000 ...
Alan Campbell

"Bir kesirle nasıl çarpılır"? Kesirler kayan noktada gösterilemez. Tanıma göre bir kesir payın paydaya bölünmesiyle elde edilir, böylece hala bölmek zorunda kaldığınız dairesel bir argümanda kalırsınız. İlk etapta bu kesiri nasıl tahmin edebiliriz?
CogitoErgoCogitoSum

5

Kayan nokta bölme donanımı, çarpma işlemi yapan bir mantık biriminin bir parçasıdır; bir çarpan donanım modülü mevcuttur. Kayan nokta sayıları, örneğin A ve B, aşağıdakilere bölünür (A / B oluşturan)

  1. kayan nokta sayılarının işaret (+1 veya -1), mantis ("a" ve "b" ve (ikili tamsayı tipi) üslere ayrıştırılması
  2. sonucun işareti (+1) ise, her iki işaret de aynı ise, (-1)
  3. üsler, sonucun üssünü oluşturmak için çıkarılır (B'nin üssü A'nın üsünden çıkarılır)
  4. mantisler (sayıların ikili rakamları) 1/2 ve 1 arasında sabit noktalı bir ikili sayıdır; Bu, ikili noktadan sonraki ilk basamağın '1', ardından sıfırlar ve birler olduğu anlamına gelir ... bir ilk adım olarak, bir arama tablosu karşılıklılığı altı bite doğru bulur (sadece 32 olasılık vardır, küçük bir tablo)

  5. ab=areciprocal(b)breciprocal(b)
    ve altı bit doğruluğu sonucu paydası 1 (beş ya da daha fazla ikili yerlerde) yakınında çok olduğunu ima not.

  6. d==1+ϵ
    d(2d)=(1+ϵ)×(1ϵ)=1ϵ2
  7. Payda, şimdi payda tam olarak '1', sonucun mantisidir ve daha önce hesaplanmış işaret ve üs ile birleştirilebilir.
  8. IEEE kayan noktası bazı istisnalara izin verir (denormalize sayılar, NAN; bunların diğer mantıksal işlemlerle ele alınması gerekir.

İlginç bir şekilde, eski Pentium bölme hatası (1994'te çok haber değeri olan), adım (4) için hatalı karşılıklı tablo değerleri yapan bir yazdırma hatasından kaynaklandı. Erken bir makale, "Paralel Çarpan Kullanan Bir Bölme Yöntemi", Domenico Ferrari, IEEE Trans. Elektron. Comput. EC-16 / 224-228 (1967), yöntemi "IBM System / 360 Model 91: Kayan Nokta Yürütme Birimi" gibi IBM J. Res. Dev. 11 : 34-53 (1967) 'de tarif edilmiştir.


1

İşlenecek sayılara bağlı olarak çok farklı bölme yöntemleri vardır. Tamsayılar için, başkaları tarafından verilen shift-and-çıkart yöntemi iyi çalışır. Bununla birlikte, kayan nokta sayıları için, ilk önce paydanın karşılıklı değerini hesaplamak ve sonra o zaman payınızı çarpmak daha hızlı olabilir.

Paydanın karşılıklı hesaplanması o kadar da kötü değil; birbirini izleyen yaklaşımları geliştirerek yapılır. G, 1 / d için tahmininiz olsun. Geliştirilmiş bir tahmin için g '= g (2-gd) kullanın. Bu, karesel olarak birleşir, böylece her iyileştirmedeki hassasiyet basamaklarını ikiye katlarsınız.

Örnek: 3.5 karşılıklarını hesaplar.

İlk tahmininiz 0.3. 0.3 * 3.5 = 1.15 hesaplayın. Ayarlanan tahmininiz 0.3 * (2 - 1.15) = 0.285'dir. Zaten oldukça yakın! İşlemi tekrarlayın ve 0.2857125 ve üçüncü bir deneme 0.2857142857 alırsınız.

Bazı kısayollar var. Kayan noktada, makinenizin sayı tabanına bağlı olarak on veya ikiden oluşan güçleri ayıklayabilirsiniz. Daha fazla bellek kullanımı pahasına hız için, gerekli karşılıklılığa hemen yakın olan bir tahminde bulunmak için 1 ila b arasındaki sayılar için (burada b sayı tabanınızdır) önceden hesaplanmış bir tablo kullanabilirsiniz. bir veya iki ayrıntılandırma adımı kaydedin.

Çarpma ve Kolmogorov'un öğrencisi Anatoly Karatsuba'nın 1960 utancında olduğu gibi, daha hızlı veya daha iyi bir yöntemin ne zaman bulunacağını asla bilemeyeceğinizi unutmayın. Merakınızı asla teslim etmeyin.


-1

Bilgisayarlar sayıları çoğaltmak için yinelemeli bir ekleme yapmaz - gerçekten yavaş olur. Bunun yerine, bazı hızlı çarpma algoritmaları vardır. Kontrol et: http://en.wikipedia.org/wiki/Karatsuba_algorithm


EE.SE'ye Hoşgeldiniz. Yalnızca bağlantıya verilen yanıtlar önerilmez. Lütfen bağlantıdaki bilgileri özetleyin.
Boş

Onlar yapar. Tonlarca CPU'nun hala tek döngülü çarpanları yoktur ve yazılımın kesilmesini kullanır.
user3528438
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.