8 bitlik ikili sayının karekökünü hesaplama


14

Belirli bir 8 bitlik sayının kare kökünü yalnızca dijital kombinasyon veya sıralı mantık kullanarak hesaplamanın bir yolunu arıyordum. Mümkün mü?

Bunun bir yolu, kesirli parçaları hiç düşünmediğim için sadece bir arama tablosu kullanmak olabilir (yani ) ancak bundan daha iyi bir yol olmalı. Birisi beni buna yönlendirebilir mi?103


4
Aralıklı basit bir arama tablosu kullanırdım. Her çıkış için minimum sayı ve maksimum ve sadece kontrol edin.
Kortuk

6
Bir arama oldukça basit görünüyor. Sonuçta, 8 bitlik bir sayının kare kökü için sadece 16 olası cevap var.
Olin Lathrop

3
hmm .. tek cevap 0000 ile 1111 arasındadır; yalnızca 64 veya daha büyük girişler yanıtta en üstteki bite sahip olacaktır, bu da girişin en üstteki iki bitinin sadece VEYA'sıdır. Şimdi azaltmak için sadece 8 bitlik üç fonksiyonunuz var ..
JustJeff 2

Yanıtlar:


9

Yorumlarda arama tablolarından bahsedilmiştir. İki yaklaşım vardır.

Hızlı
256 bayt uzunluğunda bir tablo oluşturun, bir sonraki her değer karşılık gelen dizinin kareköküdür. Doğru değere doğrudan erişmek için bağımsız değişkeni dizin olarak kullandığınız için bu hızlıdır. Dezavantajı, çok sayıda yinelenen değer içeren uzun bir tabloya ihtiyaç duymasıdır.

Kompakt Söylendiği
gibi, 8 bitlik bir tam sayı yalnızca 0 ila 255 değerlerine sahip olabilir ve karşılık gelen kare kökler 0 ila 16'dır (yuvarlak). N-girdisi ile karekök n'nin olduğu bağımsız değişken için maksimum değer olan bir 16 giriş tablosu (sıfır tabanlı) oluşturun. Tablo şöyle görünecektir:

 0  
 2  
 6  
12  
20
etc.

Tablodan geçersiniz ve argümanınızdan büyük veya ona eşit bir değerle karşılaştığınızda durursunuz. Örnek: 18'in karekökü

set index to 0
value[0] = 0, is less than 18, go to the next entry  
value[1] = 2, is less than 18, go to the next entry  
value[2] = 6, is less than 18, go to the next entry  
value[3] = 12, is less than 18, go to the next entry
value[4] = 20, is greater than or equal to 18, so sqrt(18) = 4

Hızlı arama tablosunun sabit bir yürütme süresi (yalnızca bir arama) olsa da, burada daha yüksek değer argümanları için yürütme süresi daha uzundur.

Her iki yöntem için de tablo için farklı değerler seçerek kare kök için yuvarlatılmış veya kesilmiş bir değer arasından seçim yapabilirsiniz.


2
Bu tabloyu baş aşağı çevirirseniz, ortalama olarak daha az yinelemeye ihtiyacınız olacaktır
Federico Russo

Kısa tablodaki ikili arama, algoritmayı ortalama olarak hızlandırabilir. Arama tablosunun (konum 8) yarısından başlıyorsunuz, sonra bulunan değerin çok yüksek veya çok düşük olduğuna karar veriyorsunuz ve 4 basamak mı yoksa 4 basamak mı aşağı iniyorsunuz. Tamamlanana kadar tekrarlayın.
jippie

7

8 bitte çalıştığınızda, temel olarak tamsayı çözümleriyle sınırlandırılırsınız. X'in kare köküne ihtiyacınız varsa, elde edebileceğiniz en yakın kare, kareyi X'den küçük veya ona eşit olan en büyük tamsayıdır. Örneğin, sqrt (50) için 7 elde edersiniz, çünkü 8 * 8, 50.

İşte bunu yapmak için bir püf noktası: 1 ile başlayan kaç tek sayı sayın, X'ten çıkarabilirsiniz. Bunu mantıkla yapabilirsiniz: 8 bitlik bir R1 çalışma değerini, 7 bitlik bir R2'yi tutar tek sayıyı tutar (çoğunu) ve 4 bitlik bir R3 sayacı sonucu tutar. Sıfırlamada R1, X değeri ile yüklenir, R2 sıfıra temizlenir ve R3 sıfıra temizlenir. 8 bitlik bir çıkarma devresi 'A' girişi için R1 ile beslenir ve R2 değeri 'B' girişi için '1' (sabit olarak) ile sabitlenmiş bir LSB ile birleştirilir. Çıkarıcı, 8 bitlik bir AB ve bir ödünç bit verir. Her bir saatte, ödünç biti açıksa, R1 çıkarıcı çıkışı ile yüklenir, R2 arttırılır ve R3 arttırılır. Ödünç bit ayarlanmışsa, R1 yüklenmez ve R2, R3 artırılmaz, b / c sonuç artık R3'te hazırdır.

alternatif olarak

Sadece 16 olası çıkış değeri vardır, bu yüzden cevap dört bitlik bir sayıdır. Temel olarak, 8 giriş bitinin dört tek bit işlevine sahipsiniz. Şimdi, 8 boyutlu bir Karnaugh haritası çizemiyorum, ancak prensipte cevabın her biti için bir kombinatoryal devre ortaya çıkarabilirsiniz. Bu dört kombinatoryal devrenin çıkışlarını birlikte alın ve bunları dört bitlik cevap olarak yorumlayın. Voila. Saat yok, kayıt yok, sadece bir grup NAND ve NOR yeterli.


Bütün gece bunu yapýyorum. Çıkıştaki 8 biti açıkça en önemli iki giriş bitinin bir fonksiyonudur. Benzer şekilde, çıkıştaki 4'ün bitinin muhtemelen sadece üst 4 giriş bitinin bir işlevi olduğunu düşünüyorum: 00x1, 001x, 1xx1 ve 11x1 bunu ayarlamış gibi görünüyor. Bunu daha sonra doğrulayacağız.
JustJeff

1
Bunu bir FPGA'da yapıyorsanız, bunu büyük bir caseifadeye atabilir ve sentez aracının tüm işi yapmasına izin verebilirsiniz . Bir yandan, dağıtılmış RAM'de (ROM olarak kullanılır) büyük bir arama tablosu yapmak gibi bir şey; Öte yandan araç, yorumunuzda belirttiğiniz optimizasyonları bulmalıdır.
Photon

5

Bunun herhangi bir yardım olup olmadığını bilmiyorum, ancak bir kare kökü hesaplamanın ustaca basit bir yolu var:

unsigned char sqrt(unsigned char num)
{
    unsigned char op  = num;
    unsigned char res = 0;
    unsigned char one = 0x40;

    while (one > op)
        one >>= 2;

    while (one != 0)
    {
        if (op >= res + one)
        {
            op -= res + one;
            res = (res >> 1) + one;
        }
        else
        {
            res >>= 1;
        }

        one >>= 2;
    }
    return res;
}

Sıralı mantıkta neler yapılabileceği ve yapılamayacağı hakkında çok şey bilmiyorum, ancak bu algoritma sadece 4 döngüde bittiğinden, 4 aşamada uygulayabilirsiniz.


4

0-255 arasında bir Quine-McCluskey mantık küçültücü ile tam sayı karekökü için doğruluk tablolarını çalıştırdım. Tam sayı karekökü sadece kombinatoryal mantıkla yapılabilir, ancak gibi nispeten küçük bir giriş boyutu için bile28

    A =     a
     or     b;

    B =     a and     b
     or not b and     c
     or not b and     d;

    C =     a and     b and     c
     or     a and     b and     d
     or     a and not b and not c and not d
     or     a and not c and not d and     e
     or     a and not c and not d and     f
     or not a and     c and     d
     or not a and     c and     e
     or not a and     c and     f
     or not a and not b and not d and     e
     or not a and not b and not d and     f;

     D =     a and     b and     c and     e
     or     a and     b and     c and     f
     or     a and     c and     d
     or     a and not b and not c and not d
     or     a and not b and not d and     e and     f
     or     a and not b and not d and     e and     g
     or     a and not b and not d and     e and     h
     or     a and not c and not d and not e and not f
     or     b and     c and not d and not e and not f and     g
     or     b and     c and not d and not e and not f and     h
     or not a and     b and not c and     d and     e
     or not a and     b and not c and     d and     f
     or not a and     b and not c and     d and     g
     or not a and     b and not c and     d and     h
     or not a and     c and not d and not e and not f
     or not a and     d and     e and     f
     or not a and     d and     e and     g
     or not a and     d and     e and     h
     or not a and not b and     c and not e and not f and     g
     or not a and not b and     c and not e and not f and     h
     or not a and not b and not c and     e and     f
     or not b and     c and     d and     e
     or not b and     c and     d and     f
     or not b and not c and not d and not f and     g
     or not b and not c and not d and not f and     h;

1
Vay be, hangi yazılımı yapıyor? Keyfi olarak büyük boyutlar için çalışıyor mu? Bu SOP formlarından gerçekten inşa etmek için minimum sayıda kapıyı nasıl elde edersiniz? Bu noktada bir cpld veya daha iyisi kesinlikle onu inşa etmenin en pratik yolu olurdu.
captncraig

@CMP Cevabımdaki gecikme için özür dilerim. Burada bulunan programı kullandım: home.roadrunner.com/~ssolver doğruluk tablolarını kabul edebilir - Tamsayı karekök basamaklarının her biri için bir doğruluk tablosu oluşturmak için basit bir Python betiği kullandım. Aslında yukarıda olanlar SOP olan programın bunları en aza indirmek için kullandığı algoritma yeteneğinin sınırlarına, asgari olarak.
Bitrex

1
@CMP Söylediğiniz gibi, bir arama tablosu kullanabilir veya tamsayı kare kökü için algoritmalardan birini kodlayabileceği ve HDL dilinizin onu sentezleyebileceği için tamsayı kare kökü bu şekilde uygulamak çılgınca olurdu.
Bitrex
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.