09.01.2013 Aufrufe

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 ...

MEHR ANZEIGEN
WENIGER ANZEIGEN

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

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!