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]