Dělení Demonstrační cvičení 8 INP
Přístupy k dělení sekvenční s restaurací nezáporného zbytku bez restaurace nezáporného zbytku SRT kombinační obvod založen na úplné odečítačce iterační algoritmy Newtonův iter. algoritmus
Dělení (bez znamének) Hledáme: podíl a zbytek dělení D/d Platí: D = Q.d + R D dělenec (2n) d dělitel (n) Q podíl (n) R zbytek (n) Princip: v každém kroku (i) se pokoušíme odečíst od průběžného zbytku Ri posunutý dělitel (2 -i d o i bitů vpravo)
Dělení 38:5 ( d vpravo, Ri v pevné poloze) D=100110b (38) d=101b (5) Ri+1= Ri - qn-i2 -i d i=0 100110 R0=D 2 -i d > Ri => qn-i= q3 =0-000000 q32 0 d (5.) i=1 100110 R1 2 -i d < Ri => qn-i = q2 =1-010100 q22-1 d i=2 010010 R2 2 -i d < Ri => qn-i = q1 =1-001010 q12-2 d i=3 001000 R3 2 -i d < Ri => qn-i = q0 =1-000101 q02-3 d 011 R=R4 Q=0111b (7) R=011b (3)
Dělení modifikovaný postup (Praxe: Ri, d v pevné poloze) D=100110b (38) d=101b (5) Ri+1= 2Ri - qn-id i=0 100110 2R0=D d > 2R0 => Q=0-000000 q3d i=1 100110 R1 00110x 2R1 d < 2R1 => Q=01-101000 q2d i=2 10010x R2 0010xx 2R2 d < 2R2 => Q=011-101000 q1d i=3 1000xx R3 000xxx 2R3 d < 2R3 => Q=0111-101000 q0d 011xxx R4 =2 4 R => R = 2-4 R4 Q=0111b (7) R=011b (3)
30=00011110, 7=0111, -7=1001 00011110 +1001 -d 10101110 <0, => c4=0 +0111 +d (korekce) 00011110 <- 0011110x +1001 -d 1100110x <0 => c3=0 +0111 +d (korekce) 0011110x 011110xx +1001 -d 000010xx >0 => c2=1 00010xxx +1001 -d 10100xxx <0 => c1=0 +0111 +d (korekce) 00010xxx 0010xxxx +1001 -d 1011xxxx <0 => c0=0 +0111 +d (korekce) 0010xxxx zbytek 2 Příklad: 30:7=4, zbytek 2 s restaurací nezáporného zbytku
30=00011110, 7=0111, -7=1001 00011110 +1001 -d 10101110 <0 => c4 = 0 0101110x <- +0111 +d 1100110x <0 => c3 = 0 100110xx +0111 +d 000010xx >0 => c2 = 1 00010xxx +1001 -d 10100xxx <0 => c1 = 0 0100xxxx +0111 +d 1011xxxx <0 => c0 = 0 +0111 +d (korekce na kladný zbytek) 0010xxxx zbytek 2 Příklad: 30:7=4, zbytek 2 bez restaurace nezáporného zbytku Úspornější z hlediska počtu operací.
Algoritmus SRT (1958) (Sweeney, Robertson, Tocher) umožňuje dělení čísel se znaménkem prováděné operace se pro každý krok určují (odhadují) podle nejvyšších tří bitů průběžného zbytku na závěr se případný záporný zbytek koriguje na kladný algoritmus může selhat
Algoritmus SRT tabulka odhadů Průběžný zbytek Ri d>0 bit podílu d>0 operace d<0 bit podílu d<0 operace 000 111 0 0 001 010 1 -d, -1 +d, 011 101 110-1 +d, 1 -d, 100
49=00110001, 7=0111, -7=1001-49=11001111 (d>0) -1 11001111 0111 +d 00111111 <- +1 0111111x 1001 -d 0000111x 0 000111xx <- +1 00111xxx <- 1001 -d 11001xxx <- -1 1001xxxx 0111 +d 0000xxxx zbytek 0 Q = -1 1 0 1 1 = Ri 000 111 001 010 011 101 110 100 Příklad: -49:7=-7, zb 0 SRT d>0 bit podílu 0 1-1 d>0 operace -d, +d, d<0 bit podílu 0-1 1 d<0 operace +d, -d, 2 4 2 3 2 2 2 1 2 0 = -16+8+0+2-1 = -7
53=00110101, 6=0110, -6=1010 1 00110101 1010 -d 11010101-1 1010101x <- 0110 +d 0000101x 0 000101xx <- 1 00101xxx <- 1010 -d 11001xxx <- -1 1001xxxx 0110 +d 1111xxxx záporný zbytek 0110 +d (korekce) 0101 zbytek 5 Ri 000 111 001 010 011 Příklad: 53:6=8, zb 5 SRT d>0 bit podílu 0 1 d>0 operace -d, d<0 bit podílu 0-1 d<0 operace +d, Q = 1 1 0 1 1 = 16-8+0+2-1=9 101 110 100-1 +d, 1 -d, po korekci 9-1=8
53=00110101, 6=0110, -6=1010-1 00110101 1010 +d 11010101 1 1010101x <- 0110 -d 0000101x 0 000101xx <- -1 00101xxx <- 1010 +d 11001xxx <- 1 1001xxxx 0110 -d 1111xxxx záporný zbytek 0110 +d (korekce) 0101 zbytek 5 Příklad: 53: (-6)=-8, zb 5 SRT Ri 000 111 001 010 011 d>0 bit podílu 0 1 d>0 operace -d, d<0 bit podílu 0-1 d<0 operace +d, Q = -1 1 0-1 1 = -16+8+0-2+1=-9 101 110 100-1 +d, 1 -d, po korekci -9+1=-8
51=00110011, 7=0111, -7=1001 +1 00110011 1001 -d 11000011 <- -1 1000011x 0111 +d 1111011x <- 0 111011xx <- -1 11011xxx 0111 +d 01001xxx <- -1 1001xxxx 0111 +d 0000xxxx zbytek 0 Q = 1 1 0 1 1 = 16-8-2-1 = 5 Příklad: 51: 7=7, zb 2 SRT Ri 000 111 001 010 011 101 110 100 Výsledek není správný! Odhad podle 3 bitů nepostačuje. Demonstrovali jsem selhání algoritmu SRT. d>0 bit podílu 0 1-1 d>0 operace -d, +d, d<0 bit podílu 0-1 1 d<0 operace +d, -d,
Selhání algoritmu SRT Odhad podle tří bitů průběžného zbytku je nedostatečný způsobuje časté chybování postupu SRT. Praktické realizace postupu (např. Pentium) odhadují hodnotu číslice podílu podle 7 bitů průběžného zbytku a podle 5 bitů hodnoty dělitele.
Iterační algoritmy: Newtonův iterační algoritmus pro dělení y f(x) x i x i+1 x Na základě odhadu x i hledáme přesnější odhad x i+1 v bodě průsečíku tečny s osou x. Rovnice přímky procházející bodem f(x i ) je y - f(x i ) = f'(x i )(x - x i ) Pokládáme-li přímku za aproximaci funkce f(x), můžeme psát f(x i+1 ) - f(x i ) = f'(x i )(x i+1 - x i ) V průsečíku tečny s osou x je f(x i+1 ) = 0, takže odtud dostáváme iterační vzorec x i+1 = x i - f(x i )/f'(x i )
Newtonův iterační algoritmus pro dělení Platí: x i+1 = x i - f(x i )/f'(x i ) Máme-li dělit číslem b, zvolíme: f(x) = 1/x b Pokud f(x) = 0, pak 1/x = b, resp. x = 1/b Operaci dělení a/b pak nahradíme násobením a*1/b Derivace: f'(x) = -1/x 2, odtud dosazením x i+1 = x i - (1/ x i - b)/(-1/ x i2 ) = = x i + x i - bx i2 = x i (2 - bx i ) x i+1 = x i (2 - bx i ) Postup výpočtu a/b: Posuneme b tak, aby padlo do intervalu (1,2). Pomocí tabulky odhadů zvolíme první odhad x 0. Iteračně provádíme výpočty x i+1 dokud nedostanemeřešení s požadovanou přesností na p bitů Výsledek n. iterace (x n ) vynásobíme číslem a, součin posuneme o odpovídající počet bitů (viz krok 1)
Příklad: 1/b pro b=20 b= 10100, posun des. čárky o 4b, b=1.0100 zvolím x 0 =1 x 1 = x 0 (2 bx 0 )d = 1(10-1.01x1)b = 0.11b x 2 = x 1 (2 bx 1 )d = 0.11(10-1.01x0.11) = 0.11(10 0.1111)b = 0.11x1.0001b = 0.110011b x 3 = 0.11001100110011b atd. posun des. čárky o 4b Výsledek po 3 iteračních krocích: 1/20d = 0.000011001100110011b = 0.04999923706d
Př. Ukažte, že se počet správných (přesných) bitů p se každým iteračním krokem zdvojnásobuje x i - 1/b je absolutní chyba ε i = (x i - 1/b)/(1/b) = 2 -p je relativní chyba i. kroku, hledáme ale tvar pro krok i+1, tj. pro x i+1 Vyjádříme x i = 1/b (2 -p )+1/b a dosadíme do x i+1 = x i (2 - bx i ) kde dostáváme x i+1 = (1/b (2 -p )+1/b).(2 b (1/b (2 -p )+1/b)) x i+1 = 1/b 1/b(2-2p ) což upravíme na tvar pro relativní chybu pro krok i+1: ε i+1 = (x i+1-1/b)/(1/b) = 2-2p ε i+1 /ε i = 2-2p / 2 -p = 2 -p ε i+1 = ε i.2 -p Počet přesných míst v jednotlivých iteracích: 1 2 4 8 16... Čím přesnější je počáteční odhad x 0, tím méně iterací je potřeba.
Newtonův algoritmus dělení v HW x i+1 =x i (2-bx i )
Literatura Drábek, V.: Výstavba počítačů, skriptum VUT v Brně, 1995