Talrepresentation Ett tal kan representeras binärt på många sätt. De vanligaste taltyperna som skall representeras är: • Heltal, positiva heltal (eng. integers) ett-komplementet, två-komplementet, sign-magnitude • Decimala tal med fix tal-område Fix-tal (eng. fixed-point) • Decimala tal i olika talområden Flyt-tal (eng. floating-point) William Sandqvist [email protected] Heltal Positiva Heltal: -27 26 25 24 23 22 21 20 0 1 1 0 1 1 0 1 =1⋅26 + 1⋅25 + 1⋅23 + 1⋅22 + 1⋅20 = 109 Negativa Heltal: -27 26 25 24 23 22 21 20 1 1 1 0 1 1 0 1 = -1⋅27+1⋅26 + 1⋅25 + 1⋅23 + 1⋅22 + 1⋅20 = -19 William Sandqvist [email protected] Multiplikation av två positiva heltal * 0 0 0 + 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 1 0 1 0 1 1 1 0 0 2 *11 Skifta, addera multiplikanden eller 0 1 1 0 William Sandqvist [email protected] =22 Multiplikation med teckenbit * Teckenbiten har negativ vikt! => Två-komplementera! 0 0 0 + 1 1 1 1 1 1 0 1 0 0 0 0 0 William Sandqvist [email protected] 0 0 0 1 0 1 0 1 1 1 0 0 2 -5 1 1 0 -10 Teckenbiten på det andra stället * Teckenförläng! (Sign Extension, här till 7 bitar) 1 1 0 + 0 0 1 1 1 0 0 1 1 0 0 0 0 0 0 0 0 0 1 0 1 1 1 0 0 0 1 -5 2 1 1 0 -10 William Sandqvist [email protected] Multiplikation av två negativa tal 1 1 Teckenförläng! Teckenbiten har negativ vikt! => Två-komplementera! + 0 0 * 1 1 0 1 0 1 1 0 0 1 1 1 1 0 0 1 1 0 0 0 1 0 1 1 1 1 1 1 1 -5 -5 0 0 1 +25 Svar 7-bitar med tecken Det här verkade komplicerat … William Sandqvist [email protected] Eller så gör vi det enkelt för oss Använd enbart positiva tal i multiplikationen Konvertera till positiva tal Håll reda på resultatets tecken ( + ) ⋅ ( + ) ⇒ ( + ) ( + ) ⋅ ( −) ⇒ ( −) ( −) ⋅ ( + ) ⇒ ( −) ( −) ⋅ ( −) ⇒ ( + ) Två-komplementera till negativt tal om nödvändigt William Sandqvist [email protected] Enkel lösning, forts … SignA SignB 0 1 0 0 1 1 1 0 SignA Fcorrect AN-1 AN-2 A0 SignB ... 0 Fcorrect=SignA ⊕ SignB Korrektionen sker genom att man invertera bitarna och lägg till 1 HA 0 HA 0 ... HA 2’s complement of Product, when correction is needed. William Sandqvist [email protected] Multiplikation (två positiva tal) (a3 a2 a1a0 ) ⋅ (b3b2b1b0 ) = (q7 q6 q5 q4 q3 q2 q1q0 ) AND AND FA, carry AND FA, carry AND FA, carry William Sandqvist [email protected] Multiplikation (två positiva tal) (a3 a2 a1a0 ) ⋅ (b3b2b1b0 ) = (q7 q6 q5 q4 q3 q2 q1q0 ) AND AND FA, carry AND FA, carry AND FA, carry William Sandqvist [email protected] Multiplikation (två positiva tal) (a3 a2 a1a0 ) ⋅ (b3b2b1b0 ) = (q7 q6 q5 q4 q3 q2 q1q0 ) AND AND FA, carry AND FA, carry AND FA, carry William Sandqvist [email protected] Multiplikation (två positiva tal) (a3 a2 a1a0 ) ⋅ (b3b2b1b0 ) = (q7 q6 q5 q4 q3 q2 q1q0 ) AND AND FA, carry AND FA, carry AND FA, carry William Sandqvist [email protected] Multiplikation (två positiva tal) (a3 a2 a1a0 ) ⋅ (b3b2b1b0 ) = (q7 q6 q5 q4 q3 q2 q1q0 ) AND AND FA, carry AND FA, carry AND FA, carry William Sandqvist [email protected] (a3 a2 a1a0 ) ⋅ (b3b2b1b0 ) = (q7 q6 q5 q4 q3 q2 q1q0 ) Multiplikation (två positiva tal) Skiftning av multiplikatorn sker genom att den förs ett steg till vänster i nätet för varje nivå a3 q7 q6 a3 a3 a2 a2 a1 a1 a0 a0 a3 a2 a1 a2 a1 a0 q5 q4 q3 b0 b1 b2 a0 b3 q2 q1 William Sandqvist [email protected] q0 12 FA för 4×4 bitar (a3 a2 a1a0 ) ⋅ (b3b2b1b0 ) = (q7 q6 q5 q4 q3 q2 q1q0 ) Multiplikation (två positiva tal) a3 a3 a2 a2 a1 a1 a0 a0 TMUL~(3*N-4)*TFA a3 a2 a1 a3 a2 a1 a0 q7 q6 q5 q4 q3 b2 a0 q2 b0 b1 q1 William Sandqvist [email protected] q0 b3 Carryfördröjs genom 8 steg! Kan bitarna adderas i någon annan ordning? William Sandqvist [email protected] Snabbfråga Ripple Carry-adderaren: a3 b3 Cin 3 a2 b2 Cin 2 a1 b1 Cin1 a0 b0 Cin 0 Cout 3 s Cout 2 3 s2 Cout1 s1 Cout 0 s0 • Vad händer om man förväxlar ledningarna a b Cin ? a3 b3 a2 b2 Cin 3 Här har någon rört till det ordentligt med ledningarna! Cout 3 s Cout 2 3 a) Katastrof! Cin 2 s2 Cout1 a1 b1 Cin1 a0 b0 Cin 0 s1 Cout 0 s0 b) Don’t care! Diskutera fram svaret tillsammans med din bänkgranne! William Sandqvist [email protected] Snabbfråga a3 Cin 3 b3 a2 b2 Cout 3 s Cout 2 3 Cin 2 s2 Cout1 a1 b1 Cin1 a0 b0 Cin 0 s1 Cout 0 s0 b) Don’t care! • Summabiten är lika med ”udda paritet” av inbitarna. • Carry out är lika med ”majoritetsvärdet” av inbitarna. I ingendera fallen har bitarnas inbördes ordning någon som helst betydelse. William Sandqvist [email protected] Kan bitarna adderas i någon annan ordning? Så här får q2 samma resultat men med en annan bitordning! Carry förs nu direkt till andra raden! William Sandqvist [email protected] (a3 a2 a1a0 ) ⋅ (b3b2b1b0 ) = (q7 q6 q5 q4 q3 q2 q1q0 ) En snabbare lösning - CarrySave Multiplier (BV: sida 311) Figure 5.45 Multiplier carry-save array. William Sandqvist [email protected] (a3 a2 a1a0 ) ⋅ (b3b2b1b0 ) = (q7 q6 q5 q4 q3 q2 q1q0 ) En snabbare lösning - CarrySave Multiplier (BV: sida 311) TMUL~(2*N-2)*TFA Minskar fördröjningen eftersom carry utgången kopplas direkt till nästa steg! Carryfördröjs nu genom 6 steg! Figure 5.45 Multiplier carry-save array. William Sandqvist [email protected] (a3 a2 a1a0 ) ⋅ (b3b2b1b0 ) = (q7 q6 q5 q4 q3 q2 q1q0 ) En snabbare lösning - CarrySave Multiplier (BV: sida 311) Extra tips: snabb Carrylook ahead adderare här! Figure 5.45 Multiplier carry-save array. William Sandqvist [email protected] William Sandqvist [email protected] Multiplikation med två 0101*2 = 1010 1010*2 = 10100 01010101*2 = 010101010 10010101*2 = 100101010 (5*2=10) (-6*2=-12) (85*2=190) (-107*2=-214) jmfr multiplikation med 10 i basen 10: 63*10 = 630, -63*10 = -630 etc. William Sandqvist [email protected] Multiplikation med 0101*2 = 1010 0101*22 = 10100 0101*23 = 101000 0101*24 = 1010000 n 2 (5*2=10) (5*4=20) (5*8=40) (5*16=80) jmfr multiplikation med 10 i basen 10: 6*10 = 60, 6*100 = 600, 6*1000 = 6000 etc. William Sandqvist [email protected] Multiplikation med n 2 En multiplikation med 2n kan göras med genom att skifta alla bitar n steg till vänster och att fylla på med nollor 13×8 kan beräknas genom att skifta (01011) tre bitar till höger Resultat: 01011000 motsvarar (104)10 Observera att man behöver flera bitar för att representera resultatet! William Sandqvist [email protected] Barrel-shifter B0 B1 0 1 2 3 A0 A1 Multiplexor A2 A3 0 MUX 0 1 2 3 0 0 1 2 3 0 0 1 2 3 0 0 1 2 3 0 1 2 3 0 0 1 2 3 0 0 1 2 3 B0 B1 Multiplikation med (20, 21, 22, 23) – dvs 1, 2, 4, 8 ( S 6 S5 S 4 S3 S 2 S1S 0 ) = ( A3 A2 A1 A0 ) ⋅ 2( B1B0 ) William Sandqvist [email protected] Division mellan två positiva heltal (BV sid 693 fig 10.21 b 0 1 0 1 - 1 0 - 1 0 0 0 0 0 - 0 1 1 1 1 0 1 1 1 0 1 11/2 = 5 Rest = 1 William Sandqvist [email protected] a r =q+ b b Lite mer detaljerat … 0 1 0 0 1 - 0 0 1 - 1 0 - 1 0 1 0 1 1 0 0 0 0 0 - 1 0 1 1 1 0 1 11/2 = 5 Rest = 1 William Sandqvist [email protected] a r =q+ b b Lite mer detaljerat … a r =q+ b b 01011 a: b: 1 0 11 1 = 5+ 2 2 r: q: William Sandqvist [email protected] Lite mer detaljerat … a r =q+ b b 01011 a: b: -1 0 11 1 = 5+ 2 2 r: q: 0 William Sandqvist [email protected] Lite mer detaljerat … a r =q+ b b a: b: 01011 -1 0 11 1 = 5+ 2 2 r: q: 0 0 William Sandqvist [email protected] Lite mer detaljerat … a r =q+ b b a: b: 01011 -1 0 11 1 = 5+ 2 2 r: q: 0 0 1 William Sandqvist [email protected] Lite mer detaljerat … a r =q+ b b a: b: 00011 -1 0 11 1 = 5+ 2 2 r: q: 0 0 1 0 William Sandqvist [email protected] Lite mer detaljerat … a r =q+ b b a: b: 00011 -1 0 11 1 = 5+ 2 2 r: q: 0 0 1 0 1 William Sandqvist [email protected] Lite mer detaljerat … a r =q+ b b 00001 11 1 = 5+ 2 2 r: 1 q: 0 0 1 0 1 William Sandqvist [email protected] a3 a2 a1a0 r1r0 = q3 q1q1q0 + b1b0 b1b0 a1 b0 b1 Divideraren 0 b1 1 a3 b0 subtraktion tecken -bit q3 FA 1 FA Y/N FA FA q1 1 1 FA FA FA 1 q0 q2 0 1 1 0 b1 1 b0 b1 1 0 Y/N a2 0 1 FA 0 Y/N William Sandqvist [email protected] FA 1 0 a0 b0 FA 1 0 Y/N r1 r0 1 Using a multiplier and a ROM for division A B 8-bitarstal Bara heltalsdelen 8-bitarstal 11111111.00000000 Bara fraction ROM 1/B 00000000.11111111 Q=A/B=A×(1/B) • Properties - Fast - VERY big multiplicator! MUL ≈16×16 multiplikator Q Hur många Byte måste ROM innehålla om A och B är 8 bitars tal? William Sandqvist [email protected] Using a multiplier and a ROM for division a 25 1 = = 25 × = 25,0 ⋅ 0,2 = 5,00 b 5 5 a 25 25 b 5 20 2 3 4 6 7 50 33 25 20 17 14 (0,50) (0,33) (0,25) (0,20) (0,17) (0,14) 1 b × 500 William Sandqvist [email protected] Division med negativa heltal Division med negativa tal är ganska knepigt. Ett sätt att utföra divisionen ändå Konvertera till positiva tal Håll reda på resultatets tecken ( + ) ⋅ ( + ) ⇒ ( + ) ( + ) ⋅ ( −) ⇒ ( −) ( −) ⋅ ( + ) ⇒ ( −) ( −) ⋅ ( −) ⇒ ( + ) Två-komplementera till negativt tal om nödvändigt William Sandqvist [email protected] Division med 2 0 → 01010/2 = 00101 1 → 10100/2 = 11010 (10/2 = 5) (-12/2 = -6) jmfr division med 10 i basen 10: 630/10 = 63, -630/10 = -63 etc. William Sandqvist [email protected] Logiskt och Aritmetisk shift höger Man skiljer mellan logisk och aritmetiskt shift Logisk shift höger shiftar bara till höger. Bitarna skall ej tolkas som ett tal. Man fyller bara på med 0:or. Aritmetisk shift höger behandlar bitarna som ett tal. Teckenbiten behålls vid shift. Man fyller på till vänster med teckenbiten. William Sandqvist [email protected] Division med 1010/2 = 101 10100/22 = 101 101000/23 = 101 1010000/24 = 101 n 2 (10/2=5) (20/4=5) (40/8=5) (80/16=5) jmfr division med 10 i basen 10: 60/10 = 6, 600/100 = 6, 6000/1000 = 6 etc. William Sandqvist [email protected] Division med n 2 En division med 2n kan göras med genom att skifta alla bitar n steg till höger och att fylla på med nollor Observera att resultatet behöver inte bli korrekt, eftersom man egentligen behöver bitar ”efter kommatecknet” 17/4 motsvarar att skifta 010001 2-bitar till höger Resultat: 000100 = (4)10 Eftersom (0.25)10 inte kan representeras är resultatet inte korrekt! William Sandqvist [email protected] William Sandqvist [email protected] Barrel-shifter A0 A1 A2 A3 A4 A5 A6 0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3 Division med (20, 21, 22, 23) – dvs 1, 2, 4, 8 ( S 6 S5 S 4 S3 S 2 S1S 0 ) = ( A7 A6 A5 A4 A3 A2 A1 A0 ) / 2( B1B0 ) William Sandqvist [email protected] B0 B1 Fix-tal (Fixed-point numbers) Två-komplementsrepresentation B=bN-1 . bN-2 ...b1 b0 bN-1 bN-2 ... where bi∈{0,1} b1 b0 Sign Bit Decimalt värde FiP(B)=-bN-1 20 +bN-2 2-1 +...+b1 2-(N-2)+b0 2-(N-1) Detta format kallas också för QN-1-format eller fractional representation William Sandqvist [email protected] Fixed-Point Q2-Representation 000 111 Se detta som ett -0.25 pedagogiskt exempel: Tre-bitars fixpunktstal 110 -0.5 Ett talsystem med bara 8 tal är ju i praktiken oanvändbart! 0 0.25 0.5 0.75 -0.75 101 001 -1 100 William Sandqvist [email protected] 011 010 Fixed-Point Q2-Representation 000 0.11 0.10 111 0,75 0,5 0.01 0,25 0.00 0 1.11 − 0,25 1.10 − 0,5 1.01 − 0,75 1.00 − 1.0 0 0.25 -0.25 110 001 -0.5 0.5 0.75 -0.75 101 010 -1 100 William Sandqvist [email protected] 011 − 1 ... 0 ... ≈ +1 Maximalt kvantiseringsfel Q2 -0.375 MQE: 0.125 0.6 QE: 0.1 -1 -0.75 -0.5 -0.25 0 0.25 0.5 0.75 100 101 110 111 000 001 010 011 • Maximum Quantization Error: – Since not all numbers can be represented, quantization errors occur. William Sandqvist [email protected] Multiplikation i Q-formatet Multiplikation orsakar inte overflow i Q-formatet, men kan resultera i förlust av precision (1.10)2 × (0.11)2 = (1.1010)2 (Q4-format) = (1.10)2 (Q2-format) Generellt: × Utökade teckenbitar b2 b1 b0 Q2 b2 b1 b0 Q2 b5 b4 b3 b2 b1 b0 Q4 behålles William Sandqvist [email protected] kan vara smart att avrunda … Q-formatet Fixpunktsmultiplikation och fixpunktsdivision utnyttjar samma hårdvara som heltalsmultiplikation och heltalsdivision. Användning: Digitala filter – tex. ljudkortet William Sandqvist [email protected] William Sandqvist [email protected] Flyt-tal (eng. Floating-Point Numbers) • Ett flyt-tal representeras med en tecken-bit, exponent-bitar och en mantissa ( fraktionsbitar) S Exponent Sign-Bit Mantissa exp m • Värdet beräknas som FlP(B) = (-1)s * (1.m) * 2±exp • Ofta är exp biaserad (har en offset), vilket då ger FlP(B) = (-1)s * (1.m) * 2exp-(bias) William Sandqvist [email protected] IEEE-754 • Flyttals-standarden IEEE-754 definierar ett 32bit flyttal som 27 exp 20 S Exponent 31 30 exp 2-1 m 2-23 Mantissa 23 22 m 0 • Värdet beräknas för en 8-bitars exponent enligt nedan • Specialla bit pattern har reserverats för att representera negativ och positiv nolla FlP(B) = (-1)s * (1.m) * 2exp-(127) William Sandqvist [email protected] Floating-Point Numbers (IEEE) • Exponent Values 1 to 254: normalized non-zero floating-point numbers; biased exponent (-126...+127) • Exponent of zero and fraction of zero: positive or negative zero • Exponent of ones and fraction of zero: positive or negative infinity • Exponent of zero and fraction of non-zero: Denormalized number (true exponent is –126), represent numbers from 0 to 2-126 FlP(B) = (-1)s * (0.m) * 2-126 • Exponent of ones with a non-zero fraction: NotANumber (Exception Condition) • There is also a standard for a 64-bit number William Sandqvist [email protected] IEEE – 32 bit float Tecken 1 bit, exponent 8 bitar, signifikand (mantissa) 23 bitar. Genom att exponenteten skrivs exess–127 kan flyttal storlekssorteras med vanlig heltalsaritmetik! Behandlas igen i Datortekniken … William Sandqvist [email protected] Decimalt additionsexempel normalized a = 123456.7 = 1.234567 ⋅105 aligned b = 101.7654 = 1.017654 ⋅10 2 = 0.001017654 ⋅105 Det tal som är minst (här b) skiftas (align) så båda talen får samma exponent. Flyttalsoperationer är mycket krävande, om 1.234567 ⋅105 c = a+b man inte har 5 + 0.001017654 ⋅10 specialiserad hårdvara addition kan vara mer 1.235584654 ⋅105 Svaret kan behöva normaliseras (skiftas). krävande än multiplikation! William Sandqvist [email protected] Addition med flyttal • Givet två flyttal: a = a frac ⋅ 2 b = b frac ⋅ 2 aexp bexp • Summan av dessa tal är: c = a+b Det tal som är minst skiftas (a frac + (b frac ⋅ 2 −( aexp −bexp ) )) * 2 aexp , if aexp ≥ bexp = − ( bexp − aexp ) bexp )) * 2 , if bexp ≥ aexp (b frac + (a frac ⋅ 2 William Sandqvist [email protected] Subtraktion med flyttal • Givet två flyttal: a = a frac ⋅ 2 b = b frac ⋅ 2 aexp bexp • Differensen mellan dessa tal är: c = a −b Det tal som är minst skiftas (a frac − (b frac ⋅ 2 −( aexp −bexp ) )) * 2 aexp , if aexp ≥ bexp = − ( bexp − aexp ) bexp )) * 2 , if bexp ≥ aexp (b frac − (a frac ⋅ 2 William Sandqvist [email protected] Decimalt multiplikationsexempel c = a ⋅b a = 4,734612 ⋅103 b = 5,417242 ⋅105 Resultatet har fler siffror än vad som ryms – avrunda. c = 4,734612 ⋅ 5,417242 ⋅103+5 = 25,648538980104 ⋅108 c = 2,564854 ⋅109 normalisera Multiplikation innebär att man gör en addition av exponenterna, och en multiplikation med fraktionsdelarna. Svaret måste sedan normaliseras (skiftas). William Sandqvist [email protected] Multiplikation med flyttal • Givet två flyttal: a = a frac ⋅ 2 b = b frac ⋅ 2 aexp bexp • Produkten av dessa tal är: c = a *b ( = a frac * b frac ⋅ 2 Enklare! aexp + bexp William Sandqvist [email protected] ) Division med flyttal • Givet två flyttal: a = a frac ⋅ 2 b = b frac ⋅ 2 aexp bexp • Kvoten mellan dessa tal är: c = a/b ( = a frac / b frac ⋅ 2 aexp −bexp William Sandqvist [email protected] ) Uppstädning efter flyttalsoperationer... • När en flyttals-operation är klar måste den normaliseras – Mantissans skiftas tills dess första bit är 1 – För varje skift-steg så räknas exponenten upp eller ned med ett. – Mantissans bitar till höger om den första ettan sparas FlP(B) = (-1)s * (1.m) * 2exp-(127) – Om exponenten är noll är mantissans första bit 0 FlP(B) = (-1)s * (0.m) * 2-(126) William Sandqvist [email protected] Flyttalsenhet Det krävs mycket kod och beräkningstid för att utföra flyttalsoperationer med en dator som saknar hårdvarustöd för detta. PC-datorerna har haft inbyggda flyttalsenheter från och med 486 (1989). William Sandqvist [email protected] Dyraste mjukvarubuggen? ESA rocket crashes at launch - 1996 double (64-bitars flyttal) Översättningen blev fel – rymdes inte! signed short int (16-bitars 2-komplementtal) Användes i systemet för horisontel bias Någon hade sovit under föreläsningen ”aritmetik2”! William Sandqvist [email protected] Fixed-Point vs. Floating-Point • Fixed-Point operationer fungerar pss som heltals-operations och är snabbare • Fixed-point värden behöver skalas, vilket ofta leder till förlust av precision • Kostnaden för att bygga hårdvara är signifikant större för flyttalsprocessorer/räknare William Sandqvist [email protected] Sammanfattning • Multiplikation och division av heltal – – – – Konvertera negativa tal till sitt positiva dito. Utför multiplikationen eller divisionen Håll reda på vilket tecken resultatet skall ha Konvertera positivt resultat till sitt negativa dito om resultatet skall vara negativt • Multiplikation med potenser av 2 (mul med 2k) – Implementeras som ett skift till vänster med k steg • Division med potenser av 2 (div med 2k) – Implementeras som ett (aritmetiskt) skift till höger med k steg. Teckenbiten kopieras till vänster. William Sandqvist [email protected] William Sandqvist [email protected]