Technische Informatik 2 ALU 3: Integer-Divisions- algorithmen und ...
Technische Informatik 2 ALU 3: Integer-Divisions- algorithmen und ...
Technische Informatik 2 ALU 3: Integer-Divisions- algorithmen und ...
Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.
YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.
<strong>Technische</strong> <strong>Informatik</strong> 2<br />
<strong>ALU</strong> 3:<br />
<strong>Integer</strong>-<strong>Divisions</strong>-<br />
<strong>algorithmen</strong> <strong>und</strong><br />
Fließkomma Arithmetik<br />
Prof. Dr. Miroslaw Malek<br />
Sommersemester 2012<br />
www.informatik.hu-berlin.de/rok/ca
• Festkomma - Arithmetik (Fortsetzung)<br />
- wiederherstellende Division<br />
- nichtwiederherstellende Division<br />
- Division durch wiederholte Multiplikation<br />
- Division mit Lookup-Table<br />
• Fließkomma - Arithmetik<br />
- Formate<br />
- Addition / Subtraktion<br />
- Multiplikation / Division<br />
- Pipelining<br />
• logische Operationen<br />
TI2 – <strong>ALU</strong>-3 - 2<br />
Thema heute
• Wiederhole N-mal<br />
• Verschiebe A & Q um eine Position nach links<br />
TI2 – <strong>ALU</strong>-3 - 3<br />
Algorithmus für<br />
wiederherstellende Division<br />
• Subtrahiere M von A <strong>und</strong> schreibe das Ergebnis nach A zurück<br />
• Wenn das Vorzeichenbit von A gleich 1 ist, so setze Q 0 auf 0 <strong>und</strong><br />
addiere M wieder zu A (A Wiederherstellen)<br />
• Anderenfalls setze Q 0 auf 1<br />
N+1 Bit<br />
Addierer<br />
A n<br />
Akkumulator<br />
A n-1<br />
0<br />
A<br />
A 0<br />
Dividend Q<br />
Q n-1<br />
Quotient<br />
Setzen<br />
Addiere/<br />
Subtrahiere<br />
Divisor M<br />
Mn-1 M0 Q 0<br />
Steuer-<br />
logik
TI2 – <strong>ALU</strong>-3 - 4<br />
START<br />
Q ← Dividend<br />
COUNT← 0<br />
M ← Divisor<br />
A ← 0<br />
Linksverschiebung von A, Q<br />
Nein<br />
Ja<br />
A ← A-M<br />
A(n-1)=1?<br />
Q(0) ← 1<br />
COUNT=<br />
n-1?<br />
STOP<br />
Wiederherstellender <strong>Divisions</strong>algorithmus<br />
für positive ganze Zahlen<br />
Ja<br />
Nein<br />
A-Akkumulator<br />
M-Divisor<br />
Q(0) ← 0<br />
A ← A+M<br />
COUNT ← COUNT+1<br />
Quotient in Q; Rest in A<br />
Q-Dividend/Quotient
TI2 – <strong>ALU</strong>-3 - 5<br />
Beispiel für eine<br />
Wiederherstellende Division<br />
15 10 :5 10 Q=15 10 =01111 M=5 10 =00101 2 -M=11011 2<br />
A Q Kommentar A Q Kommentar<br />
00000 01111 Shift 11110 M addieren<br />
00000 11110 M substrahieren 00101<br />
11011 00011 11000 Shift<br />
11011 M addieren 00111 10000 M substrahieren<br />
00101 11011<br />
00000 11110 Shift 00010 10001 Shift<br />
00001 11100 M substrahieren 00101 00010 M substrahieren<br />
11011 11011<br />
11100 M addieren 00000 00011 Ergebnis (3 10 )<br />
00101<br />
00001 11100 Shift<br />
00011 11000 M substrahieren<br />
11011
TI2 – <strong>ALU</strong>-3 - 6<br />
Algorithmus für<br />
nichtwiederherstellende Division<br />
1. Wiederhole n-mal:<br />
– Wenn das Vorzeichenbit von A = 0 ist, verschiebe A <strong>und</strong> Q um<br />
eine binäre Position nach links <strong>und</strong> subtrahiere M von A;<br />
– Andernfalls verschiebe A <strong>und</strong> Q nach links <strong>und</strong> addiere M zu A.<br />
– Wenn das Vorzeichenbit von A=0 ist, setzte Q 0 auf 1,<br />
anderenfalls setze Q 0 auf 0;<br />
2. Wenn das Vorzeichenbit von A = 1 ist, addiere M zu A<br />
Das negative Ergebnis wird durch Addieren wiederhergestellt,<br />
z.B:<br />
R i � ( R i - M ) +M (1)<br />
<strong>und</strong> dann um eine Position nach links geschoben (d.h.<br />
Multiplikation mit 2) <strong>und</strong> subtrahiert:<br />
R i+1 � 2 R i - M (2)<br />
Die beiden Operationen (1) <strong>und</strong> (2) werden dann als eine<br />
ausgeführt:<br />
R i+1 � 2 [(R i - M) + M] - M = 2 R i - M
Start<br />
Q�Dividend<br />
Count�0<br />
M�Divisor<br />
A�0<br />
Leftshift A,Q<br />
A�A-M<br />
A(n-1)=1?<br />
Leftshift A,Q<br />
A�A-M<br />
nein<br />
TI2 – <strong>ALU</strong>-3 - 7<br />
Nichtwiederherstellender <strong>Divisions</strong>algorithmus<br />
für Pos. Ganze Zahlen<br />
ja<br />
Leftshift A,Q<br />
A�A+M<br />
Count�Count+1<br />
Q(0)=A(n-1)<br />
ja<br />
ja<br />
Count=<br />
n-1?<br />
A(n-1)=1?<br />
A�A+M<br />
Stop<br />
nein<br />
Quotient in Q<br />
Rest in A<br />
nein
TI2 – <strong>ALU</strong>-3 - 8<br />
Beispiel für eine<br />
Nichtwiederherstellende Division<br />
15 10 :5 10 Q=15 10 =01111 M=5 10 =00101 2 -M=11011 2<br />
A Q Kommentar<br />
00000 01111 Shift<br />
00000 11110 M substrahieren<br />
11011<br />
11011 11110 Shift<br />
10111 11100 M addieren<br />
00101<br />
11100 11100 Shift<br />
11001 11000 M addieren<br />
00101<br />
11110 11000 Shift<br />
11101 10000 M addieren<br />
00101<br />
00010 10001 Shift<br />
00101 00010 M substrahieren<br />
11011<br />
00000 00011 Ergebnis (3 10 )
TI2 – <strong>ALU</strong>-3 - 9<br />
Q=<br />
Division durch wiederholte<br />
Multiplikation<br />
Dividend * F 0 * F 1 * ...<br />
Divisor * F 0 * F 1 * ...<br />
Divisor = V = 1-y F 0 = 1+y F 1 = 1+y 2<br />
V * F 0 = 1-y 2 V * F 0 * F 1 = (1-y 2 ) (1+y 2 ) = 1-y 4<br />
Multipliziere Dividend <strong>und</strong> Divisor mit (1+y), dann (1+y2 ), ...<br />
1 1 1 ( 1 )( 1 )<br />
1 1<br />
1 y4 y2 y<br />
y2 + y + +<br />
= = =<br />
x - y -<br />
-<br />
y<br />
Schlüsselidee:<br />
Finde eine einfache Funktion (Faktor), bei deren Anwendung<br />
durch die wiederholte Multiplikation der Wert 1 erreicht wird.<br />
2i<br />
y2i y4 y2 1 ( 1 + y )( 1 + )( 1 + )…( 1 +<br />
=<br />
)<br />
x 1 -<br />
i=3,4,…<br />
0
TI2 – <strong>ALU</strong>-3 - 10<br />
Fließkommaarithmetik:<br />
Wissenschaftliche Notation<br />
Komponenten der Darstellung von Fließkommazahlen<br />
1. Vorzeichen V<br />
2. Exponent X e<br />
3. Mantisse X m<br />
4. Basis B<br />
� X = (-1) V * X m * B Xe<br />
Beispiele: + 1.234 * 10 2<br />
0.1024 * 10 4<br />
9.9999 * 10 99
32 Bit Format<br />
VZ<br />
Binäre Normalisierung am Beispiel<br />
TI2 – <strong>ALU</strong>-3 - 11<br />
32 Bit<br />
E M<br />
7-Bit Exponent<br />
Fließkommaformat der<br />
IBM S/360 <strong>und</strong> S/370<br />
Normalisierung hält die Mantisse beim Wert von<br />
0.5 ≤ M < 1 -64 ≤ E ≤ 63<br />
24-Bit Mantisse<br />
0 0001001 001.......<br />
Nichtnormalisierter Wert<br />
0 0000111 1.......<br />
Normalisierter Wert (andere Arten der<br />
Normalisierung möglich)<br />
+0.001...x2 9<br />
+0.1...x2 7<br />
Excess - 64 Format: E‘= E + 64 0 ≤ E’ ≤ 127
TI2 – <strong>ALU</strong>-3 - 12<br />
IEEE 754 Fließkommaformat:<br />
(Single Precision)<br />
31 30 23 22 0<br />
VZ E 7 ... E 0 M 1 ... M 23<br />
Vorzeichen<br />
Exponent Mantisse<br />
• Vorzeichen: 1=negative Mantisse, 0=positive Mantisse<br />
• Exponent: 8 Bit mit Bias von 127, 0 < E‘ < 255<br />
• Mantisse: 23 Bit Signifikant plus implizit M 0 =1 wegen<br />
Normalisierung (1.M)<br />
à� x=(-1) VZ (Exponent -127 )<br />
2 10 * (1,Signifikant) 2 * 210 • Genauigkeit: 24 Bit<br />
• Rang vom Wert: 1,18*10 -38
TI2 – <strong>ALU</strong>-3 - 13<br />
IEEE 754 Fließkommaformat:<br />
(Double Precision)<br />
63 62 52 51 0<br />
VZ E 10 ... E 0 M 1 ... M 52<br />
Vorzeichen<br />
• Vorzeichen: 1=negative Mantisse, 0=positive Mantisse<br />
• Exponent: 11 Bit mit Bias von 1.023<br />
• Mantisse: 52 Bit plus implizit M 0 =1 wegen Normalisierung<br />
à� x=(-1) VZ * (1,Signifikant) 2 * 2 10<br />
Exponent Mantisse<br />
(Exponent 2 -1023 10 )<br />
• Genauigkeit: 53 Bit<br />
• Rang vom Wert: 2,23*10 -308
TI2 – <strong>ALU</strong>-3 - 14<br />
IEEE 754 Fließkommaformat:<br />
Temporäre reelle Zahl<br />
79 78 64 63 0<br />
VZ E 14 ... E 0 M 1 ... M 63<br />
Vorzeichen<br />
• Vorzeichen: 1=negative Mantisse, 0=positive Mantisse<br />
• Exponent: 15 Bit mit Bias von 16.383<br />
• Mantisse: 64 Bit plus implizit M 0 =1 wegen Normalisierung<br />
à� x=(-1) VZ * (1,Signifikant) 2 * 2 10<br />
Exponent Mantisse<br />
(Exponent 2 -16383 10 )<br />
• Genauigkeit: 64 Bit<br />
• Rang vom Wert: 3,37*10 -4932
TI2 – <strong>ALU</strong>-3 - 15<br />
Eigenschaften von IEEE 754<br />
(Single Precision)<br />
Mantisse mit eingesetzter 1 24 Bits 1 ≤ M' < 2<br />
Größter Fehler 2 -24<br />
Genauigkeit » 7 dezimale Einheiten<br />
Verschiebung 127<br />
Exponentenrang -126 ≤ E ≤ 127<br />
Betragsmäßig kleinste Zahl ≠ 0 2 -126 = 1.2 * 10 -38<br />
Größte Zahl (2 - 2 -23 ) 2 127 = 3.4 * 10 38<br />
Sonderfälle:<br />
a) Null (-1) S * 0 E‘=0, M=0<br />
b) Anfangs (-1) S ∞ E‘=255, M=0<br />
c) Nicht Zahl E‘=255, M≠0<br />
d) Normalisiert (-1) S * (1.M) 2 E‘-127 0 < E‘ < 255<br />
e) Nichtnormalisiert (-1) S * (0.M) 2 -126<br />
E‘=1, M≠0 (Diese Zahl kann nicht normalisiert werden, weil die<br />
Linksverschiebung einen Unterlauf verursachen würde)
TI2 – <strong>ALU</strong>-3 - 16<br />
Unterlauf <strong>und</strong> Überlauf<br />
• Ein Unterlauf tritt auf, wenn der resultierende verschobene<br />
Exponent kleiner als Null (oder Eins, IEEE) ist. In diesem Fall<br />
wird das gesamte Fließkommawort auf Null gesetzt.<br />
• Ein Überlauf tritt auf, wenn der resultierende verschobene<br />
Exponent größer ist, als der für das Exponent-Feld erlaubte<br />
Maximalwert.<br />
• In beiden Fällen wird normalerweise ein Error-Bit im Status-<br />
Word gesetzt oder ein Interrupt ausgelöst, so dass ein<br />
Programm entscheiden kann, welche Aktion auf einen Unter-<br />
oder Überlauf folgen soll.
TI2 – <strong>ALU</strong>-3 - 17<br />
Normalisierung <strong>und</strong> Skalierung<br />
• Normalisierung ist ein Prozess zur Sicherstellung<br />
der maximalen Genauigkeit einer Fließkommazahl.<br />
• Normalisierung: Die Ziffer “1” muss an der am<br />
weitesten linken Position (direkt nach dem<br />
Komma) auftreten.<br />
• Linksverschiebung der Mantisse entspricht einer<br />
Subtraktion von 1 vom Exponenten<br />
• Rechtsverschiebung der Mantisse entspricht einer<br />
Addition von 1 zum Exponenten.<br />
• Beispiele :<br />
1.27 x 10 5 = .127 x 10 6<br />
42.1 x 10 -6 = .421 x 10 -4
TI2 – <strong>ALU</strong>-3 - 18<br />
Probleme: Arithmetik <strong>und</strong> R<strong>und</strong>en<br />
• Fließkommaaddition <strong>und</strong> -subtraktion sind<br />
komplizierter als Multiplikation oder Division,<br />
da beide Operanden durch Verschiebung auf<br />
den gleichen Exponenten gebracht werden<br />
müssen (Denormalisierung)<br />
• Gebrochene binäre Arithmetik kann aufgr<strong>und</strong><br />
der begrenzten Bit-Repräsentation zu<br />
ungenauen Ergebnissen führen. “Guard bits”<br />
oder größere (“breitere”) Register werden bei<br />
der Präzisionserhöhung gebraucht. Das<br />
Ergebnis wird nach der Operation ger<strong>und</strong>et.
TI2 – <strong>ALU</strong>-3 - 19<br />
R<strong>und</strong>en<br />
R<strong>und</strong>ungsmethoden Ergebnissse Guard Bits Kommentare<br />
Chopping (Abschneiden):<br />
Das Ergebnis<br />
wird nicht ger<strong>und</strong>et<br />
Normale R<strong>und</strong>ung:<br />
1 wird zum Ergebnis<br />
addiert. LSB wenn<br />
das Ergebnis von<br />
einem Guard Bit<br />
gefolgt wird<br />
Von Neumann:LSB<br />
wird auf 1 gesetzt,<br />
wenn MSB von den<br />
Guard Bits 1 ist.<br />
0.0010<br />
0.0010]<br />
0.0010<br />
0.0011]<br />
0.0011<br />
0.0100]<br />
0.0010<br />
0.0011]<br />
0.0011<br />
0.0011]<br />
110 „biased error“<br />
110<br />
110<br />
110<br />
110<br />
0-Chopped Bits<br />
„unbiased<br />
error“<br />
-0.5 bis +0.5<br />
(LSB)<br />
Komplexere<br />
Umsetzung,<br />
„unbiased<br />
error“:-1 bis<br />
+1 (LSB)
X E , Y E - Exponenten von X <strong>und</strong> Y<br />
X M , Y M - Mantisse von X <strong>und</strong> Y<br />
TI2 – <strong>ALU</strong>-3 - 20<br />
X E -Y E<br />
ADD X + Y = ( X M * 2 + Y M ) * 2<br />
SUB X - Y = ( X M * 2 - Y M ) * 2<br />
MULT X * Y = ( X M * Y M ) * 2<br />
DIV X / Y = ( X M / Y M ) * 2<br />
Gleichungen für<br />
Fließkommaoperationen<br />
Y E<br />
X E -Y E Y E<br />
X E +Y E<br />
X E -Y E
TI2 – <strong>ALU</strong>-3 - 21<br />
Fließkomma:<br />
Addition <strong>und</strong> Subtraktion<br />
1) Auswahl der Zahl mit dem kleineren Exponenten <strong>und</strong><br />
Verschiebung seiner Mantisse schrittweise nach rechts<br />
entsprechend der Differenz der Exponenten<br />
2) Setze den Exponenten des Ergebnisses gleich dem größeren<br />
Exponenten<br />
3) Führe die Addition oder Subtraktion der Mantissen aus <strong>und</strong><br />
setze das Vorzeichen des Ergebnisses<br />
4) Normalisiere das Ergebnis (falls nötig)<br />
5) Prüfe auf Überlauf/Unterlauf
TI2 – <strong>ALU</strong>-3 - 22<br />
Fließkomma:<br />
Multiplikation <strong>und</strong> Division<br />
Multiplikation<br />
1) Addiere Exponenten<br />
2) Multipliziere Mantissen <strong>und</strong> setze Vorzeichen des Ergebnisses<br />
3) Normalisiere den resultierenden Wert (falls nötig)<br />
4) Prüfe auf Überlauf/Unterlauf<br />
Division<br />
1) Subtrahiere Exponenten<br />
2) Dividiere Mantissen <strong>und</strong> setze Vorzeichen des Ergebnisses<br />
3) Normalisiere den resultierenden Wert (falls nötig)<br />
4) Prüfe auf Überlauf/Unterlauf<br />
Überlauf exp > + Bereich<br />
Unterlauf exp < - Bereich
Daten<br />
bus<br />
TI2 – <strong>ALU</strong>-3 - 23<br />
Steuer<br />
bus<br />
Fließkommaarithmetikschema<br />
Exponenten-<br />
einheit<br />
Steuereinheit<br />
Mantissen-<br />
einheit
Daten<br />
bus<br />
TI2 – <strong>ALU</strong>-3 - 24<br />
Exponenteneinheit<br />
E1 E2<br />
Addierer<br />
E<br />
Datenverarbeitender Teil einer<br />
einfachen Fließkomma-Einheit<br />
Mantisseneinheit<br />
AC MQ<br />
Addierer<br />
DR
TI2 – <strong>ALU</strong>-3 - 25<br />
AC<br />
Exponen-<br />
tenaddierer<br />
E<br />
Ein kombiniertes Schema zur<br />
Fließkommaarithmetik<br />
MQ<br />
Mantissen-<br />
addierer<br />
DR
Input<br />
bus<br />
Output<br />
bus<br />
TI2 – <strong>ALU</strong>-3 - 26<br />
Fließkommaaddierer eines IBM<br />
Mainframe<br />
E1 E2<br />
M1 M2<br />
Addierer 1<br />
Addierer 3<br />
E1 - E2<br />
Teste auf 0-<br />
Bit<br />
Shifter 1<br />
Addierer 2<br />
R<br />
Shifter 2<br />
E3 M3<br />
Exponenten-<br />
vergleich <strong>und</strong><br />
Mantissen-<br />
präzisierung<br />
Mantissen<br />
Addition/<br />
Subtraktion<br />
Normalisierung<br />
der Ergebnisse
Eingangs-<br />
bus<br />
Exponenten<br />
vergleichen<br />
Exponenten<br />
angleichen<br />
Mantissen-<br />
addition<br />
Normalisierung<br />
Ausgangsbus<br />
TI2 – <strong>ALU</strong>-3 - 27<br />
Pipeline-Version des<br />
Fließkommaaddierers<br />
E1 E2 M1 M2<br />
E4 E5 M4 M5<br />
Verschieber 1<br />
E6 M6 M7<br />
E7<br />
Addierer 3<br />
E3<br />
Addierer<br />
1<br />
Teste auf 0-<br />
Bit<br />
Addierer 2<br />
R<br />
Verschieber 2<br />
M3
• Logische Verknüpfungen<br />
• Programmverzweigungen<br />
• Vergleiche<br />
TI2 – <strong>ALU</strong>-3 - 28<br />
Weitere Operationen
Z<br />
c c2XY<br />
=<br />
AND<br />
TI2 – <strong>ALU</strong>-3 - 29<br />
Implementierung der log. Befehle<br />
AND, OR, XOR <strong>und</strong> NOT<br />
X Y<br />
m m<br />
c<br />
c<br />
m<br />
Z<br />
X + c1c<br />
OR<br />
Y<br />
c<br />
NOT<br />
XOR<br />
OR<br />
AND<br />
Amerikanische Symbolnotation<br />
c<br />
XY<br />
+ c1c<br />
XOR<br />
XY<br />
1 1 2 2 1 2<br />
2<br />
+<br />
+<br />
+<br />
1/4<br />
Dekoder<br />
c1c2<br />
X<br />
NOT<br />
c 1<br />
c 2
TI2 – <strong>ALU</strong>-3 - 30<br />
Zero<br />
Flip-Flop<br />
(flag)<br />
Amerikanische Symbolnotation<br />
Implementierung zweier bedingter<br />
Sprünge SZA <strong>und</strong> SNA<br />
Akkumulator<br />
AC<br />
. . .<br />
D<br />
0 1<br />
SNA<br />
SZA<br />
IR<br />
Befehls-<br />
dekodierer<br />
Zähler<br />
aktiviert<br />
SZA – Skip on AC = 0<br />
SNA – Skip on AC ≠ 0<br />
PC<br />
Programmzähler
TEST AUF A>B (oder A B<br />
A < B