Jak dochodzi do podziału w komputerach cyfrowych? Jaki jest dla niego algorytm?
Szukałem intensywnie w Google, ale nie uzyskałem zadowalających wyników. Podaj bardzo wyraźny algorytm / schemat blokowy dla algorytmu podziału z przykładową ilustracją.
computers
tutorial
arithmetic-division
program-o-steve
źródło
źródło
Odpowiedzi:
Algorytmy podziału w projektach cyfrowych można podzielić na dwie główne kategorie. Wolny podział i szybki podział.
Sugeruję przeczytanie o tym, jak działają binarne dodawanie i odejmowanie, jeśli nie znasz jeszcze tych pojęć.
Slow Division
Najprostsze powolne metody działają w następujący sposób: Odejmij mianownik od licznika. Zrób to rekurencyjnie z wynikiem każdego odejmowania, aż reszta będzie mniejsza niż mianownik. Ilość iteracji jest ilorazem całkowitym, a pozostała ilość to reszta.
Przykład:
7/3:
Tak więc odpowiedź to 2, a reszta to 1. Aby uczynić tę odpowiedź nieco bardziej trafną, oto trochę tła. Odejmowanie binarne poprzez dodanie ujemnego jest wykonywane np .: 7 - 3 = 7 + (-3). Dokonuje się tego za pomocą uzupełnienia dwóch. Każda liczba binarna jest dodawana przy użyciu serii pełnych sumatorów:
Gdzie każdy 1-bitowy pełny sumator jest implementowany w następujący sposób:
Szybki podział
Chociaż wolniejsza metoda podziału jest łatwa do zrozumienia, wymaga powtarzalnych iteracji. Istnieją różne „szybkie” algorytmy, ale wszystkie polegają na oszacowaniu.
Rozważ metodę Goldschmidta:
Wykorzystam następujące:Q=ND
Ta metoda działa w następujący sposób:
Ta metoda wykorzystuje binarne mnożenie poprzez iteracyjne dodawanie, które jest również stosowane w nowoczesnych procesorach AMD.
źródło
Sprzęt do dzielenia zmiennoprzecinkowego jest częścią jednostki logicznej, która również wykonuje mnożenie; dostępny jest moduł sprzętowy multiplikatora. Liczby zmiennoprzecinkowe, powiedzmy A i B, są podzielone (tworząc A / B) przez
mantysy (cyfry binarne liczb) to stała liczba binarna między 1/2 a 1; oznacza to, że pierwsza cyfra po punkcie binarnym to „1”, a następnie zera i jedynki… w pierwszym kroku tabela przeglądowa znajduje odwrotność z dokładnością do sześciu bitów (są tylko 32 możliwości, to mały stolik)
aby rozpocząć obliczanie a / b, wykonaj dwie mnożeniazab= a ∗ r e c i p r o c a l ( b )b ∗ r e c i p r o c a l ( b )
i zauważ, że sześciobitowa dokładność oznacza, że mianownik wyniku jest bardzo bliski 1 (do pięciu lub więcej miejsc binarnych).
Co ciekawe, stary błąd podziału Pentium (bardzo godny uwagi w 1994 r.) Został spowodowany błędem drukowania, który spowodował błędne wartości tabeli wzajemnej dla kroku (4). Wczesny artykuł, „A Division Method using Parallel Multplier”, Domenico Ferrari, IEEE Trans. Elektron. Comput. EC-16 / 224-228 (1967), opisuje metodę, podobnie jak „IBM System / 360 Model 91: Jednostka wykonująca zmiennoprzecinkowe” IBM J. Res. Dev. 11 : 34-53 (1967).
źródło
Istnieją bardzo różne metody podziału, w zależności od obsługiwanych liczb. W przypadku liczb całkowitych metoda shift-and-odtract podana przez innych będzie działać poprawnie. Jednak w przypadku liczb zmiennoprzecinkowych może być szybsze obliczenie odwrotności mianownika, a następnie pomnożenie tej liczby przez licznik.
Obliczenie wzajemności mianownika nie jest takie złe; odbywa się to poprzez udoskonalanie kolejnych przybliżeń. Niech g zgadnie dla 1 / d. Aby uzyskać lepsze przypuszczenie, użyj g '= g (2-gd). Zbiega się to kwadratowo, więc podwajasz cyfry precyzji przy każdej poprawce.
Przykład: obliczyć odwrotność 3,5.
Początkowa wartość wynosi 0,3. Obliczasz 0,3 * 3,5 = 1,15. Twoje skorygowane domysły wynoszą 0,3 * (2 - 1,15) = 0,285. Już całkiem blisko! Powtórz proces, a otrzymasz 0.2857125, a trzecia próba otrzyma 0.2857142857.
Istnieje kilka skrótów. W zmiennoprzecinkowym możesz wyodrębnić potęgi dziesięciu lub potęgi dwóch, w zależności od podstawy liczbowej twojej maszyny. Aby uzyskać szybkość kosztem większego wykorzystania pamięci, można użyć wstępnie obliczonej tabeli dla liczb w zakresie od 1 do b (gdzie b jest bazą liczbową), aby uzyskać domysł, który jest natychmiast bliski wymaganej wzajemności i zapisz jeden lub dwa etapy udoskonalania.
Należy pamiętać, że podobnie jak w przypadku mnożenia i zawstydzenia Kołmogorowa w 1960 r. Przez jego studenta Anatolija Karatuby, nigdy nie wiadomo, kiedy można znaleźć szybszą lub lepszą metodę. Nigdy nie rezygnuj z ciekawości.
źródło
Komputery nie wykonują iteracyjnego dodawania do mnożenia liczb - byłoby to naprawdę wolne. Zamiast tego istnieją algorytmy szybkiego mnożenia. Sprawdź: http://en.wikipedia.org/wiki/Karatsuba_algorithm
źródło