20.11.2013 Aufrufe

2 Repräsentation von elementaren Daten

2 Repräsentation von elementaren Daten

2 Repräsentation von elementaren Daten

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.

2 <strong>Repräsentation</strong> <strong>von</strong> <strong>elementaren</strong> <strong>Daten</strong><br />

Alle (elemtaren) <strong>Daten</strong> wie Zeichen und Zahlen werden im Dualsystem repräsentiert.<br />

Das Dualsystem ist ein spezielles B-adisches Zahlensystem, nämlich mit der<br />

Basis B=2.<br />

2.1 B-adische Zahlensysteme<br />

Im B-adischen Zahlensystem (mit B ≥ 2, B ∈ N) wird jede reelle Zahl wie<br />

folgt dargestellt:<br />

z = n−1 ∑<br />

i=−∞<br />

Beispiele:<br />

a i B i mit a i ∈ {0, .., B − 1}, n ∈ N +<br />

B=10 Dezimalsystem mit a i = {0, 1, .., 9}<br />

953, 48 = 8 · 10 −2 + 4 · 10 −1 + 3 · 10 0 + 5 · 10 1 + 9 · 10 2<br />

B=2 Dualsystem mit a i = {0, 1}<br />

1011, 01 = 1 · 2 −2 + 0 · 2 −1 + 1 · 2 0 + 1 · 2 1 + 0 · 2 2 + 1 · 2 3 = (11, 25) 10<br />

B=16 Hexadezimalsystem mit a i = {0, 1, .., 9, A, B, C, D, E, F }<br />

B30E=14 · 16 0 + 0 · 16 1 + 3 · 16 2 + 11 · 16 3 = (45838) 10<br />

B=1 geht nicht, weil nur die 0 darstellbar ist:<br />

z = n−1 ∑<br />

0 · 1 i = 0<br />

i=−∞<br />

Übliche Schreibweise: Falls z = n−1 ∑<br />

i=−∞<br />

a i B i dann schreibt man<br />

z = (a n−1 a n−2 · · · a 0 .a −1 a −2 · · · ) B bzw. falls B klar ist<br />

z = a n−1 a n−2 · · · a 0 .a −1 a −2 · · ·<br />

9


2.1.1 Rechnen im B-adischen System<br />

Definition: Seien a, b, q, r ∈ N und es ist a = b · q + r mit 0 ≤ r < b, dann<br />

gilt folgende Schreibweise:<br />

• a mod b = r<br />

• [ a<br />

b<br />

]<br />

= q<br />

Addition: Ziffernweise Addition mit Übertrag<br />

( c n−1 . . . c i . . . c 0 . c −1 . . . c −m ) B<br />

( d n−1 . . . d i . . . d 0 . d −1 . . . d −m ) B<br />

( e n e n−1 . . . e i . . . e 0 . e −1 . . . e −m ) B<br />

mit e i = (c i + d i + ü i−1 ) mod B und e n = ü n−1<br />

]<br />

ü i =<br />

und ü −m−1 = 0<br />

Beispiel:<br />

[<br />

ci +d i +ü i−1<br />

B<br />

A50F.5<br />

0B52.6<br />

B061.B<br />

101011.11<br />

110110.01<br />

1100010.00<br />

Multiplikation: Schriftlich multiplizieren<br />

c = n−1 ∑<br />

i=−m<br />

c i B i<br />

∑k−1<br />

c·d = c·<br />

j=−l<br />

d j B j =<br />

d = k−1 ∑<br />

∑k−1<br />

j=−l<br />

j=−l<br />

d j B j<br />

cd j B j =<br />

∑k−1<br />

j=−l<br />

( n−1 ∑<br />

i=−m<br />

c i B i d j<br />

)<br />

B j =<br />

∑k−1<br />

j=−l<br />

( n−1 ∑<br />

i=−m<br />

c i d j B i )<br />

B j<br />

e ij = (c i · d j + ü i−1,j ) mod B<br />

[ ]<br />

ci·d<br />

ü ij =<br />

j +ü i−1,j<br />

und ü −m,j = 0<br />

B<br />

kleinste Stelligkeit B −m · B −l = B −(m+l)<br />

10


Beispiel:<br />

37.24 · 6.368<br />

22344<br />

11172<br />

22344<br />

29792<br />

23714432<br />

101, 01 · 10, 1<br />

10101<br />

00000<br />

10101<br />

1101001<br />

Wir haben nun gesehen wie man im B-adischen Zahlensystem und insbesondere<br />

auch im dualen Zahlensystem ganz schematisch Zahlen addieren und<br />

multiplizieren kann.<br />

Wir Menschen sind es gewohnt im Dezimalsystem zu rechnen, während Rechner<br />

im Dualsystem arbeiten → Notwendigkeit Darstellung umzuwandeln<br />

2.1.2 Umrechnung <strong>von</strong> Darstellungen<br />

b-adische Darstellung<br />

} {{ }<br />

Quellsystem<br />

→ B-adische Darstellung<br />

} {{ }<br />

Zielsystem<br />

Im Prinzip 2 Möglichkeiten, wir sehen uns nur eine an, nämlich Rechnen<br />

im Zielsystem<br />

Beachte: Exakte Umrechnung für Dezimalzahlen nicht immer möglich<br />

Rechnen im Zielsystem (natürliche Zahlen)<br />

• verwende Hornerschema zur Darstellung im Quellsystem, d.h.<br />

∑n−1<br />

z = a i b i = a 0 +a 1 b+. . .+a n−1 b n−1 = a 0 +b(a 1 +b(a 2 +. . .+b(a n−2 +ba n−1 ) . . .))<br />

i=0<br />

11


• stelle die a i und b im Zielsystem dar und berechne entsprechenden Term<br />

Beispiele:<br />

Umrechnung der Hexadezimalzahl EF01 ins Dezimalsystem<br />

EF 01 = [1+10(0+10(F +10E))] 16 = [1+16(0+16(15+16·14))] 10 = 61185<br />

Umrechnung der Dezimalzahl 81 ins Dualsystem<br />

81 = (1 + 10 · 8) 10 = (1 + 1010 · 1000) = 1010001<br />

Bei Dezimalzahlen wendet man obiges Schema getrennt auf Vor- und Nachkommabereich<br />

an, d.h.<br />

z =<br />

∑n−1<br />

i=−m<br />

a i b i =<br />

∑−1<br />

i=−m<br />

∑n−1<br />

a i b i + a i b i =<br />

i=0<br />

b −1 (a −1 + b −1 (a −2 + · · · + b −1 (a −m+1 + b −1 a−m)...))<br />

+a 0 + b(a 1 + b(a 2 + · · · + b(a n−2 + ba n−1 )...))<br />

Problem: Darstellung <strong>von</strong> b −1 im Zielsystem<br />

z.B. b=10 B=2<br />

(0, 1) 10 = 10 −1 · 1 ≈ (0, 00011001101) 2 = 0, 10009765625<br />

→ Fehler bei Zahlenumwandlung<br />

2.2 <strong>Repräsentation</strong> <strong>von</strong> Zeichen<br />

Im Rechner sind nur Binärzahlen repräsentierbar<br />

→ Codierung <strong>von</strong> Zeichen als Binärzahl<br />

2.2.1 ASCII-Code<br />

• American Standard Code for Information Interchange (1963)<br />

• Initial entwickelt zur Übermittlung und zum Ausdrucken <strong>von</strong> Texten<br />

⇒ In ASCII sind sowohl Zeichen wie Klein- und Großbuchstaben oder<br />

Ziffern als auch Steuerzeichen zum Drucken codiert<br />

12


• ASCII-Code verwendet 7 Binärstellen → 7 Bit-Code ̂= 2 7 = 128 unterschiedliche<br />

Zeichen sind kodierbar<br />

Mittlerweile Standard: 1 Byte = 8 Bit als elementare <strong>Repräsentation</strong>seinheit<br />

im Rechner ⇒ achtes Bit frei ⇒<br />

13


1. Verwendung als Paritätsbit um <strong>Daten</strong>übertragung zu überprüfen, d.h.<br />

falls 8.Bit = 0 → restliche 7 Bit enthalten gerade Anzahl <strong>von</strong> Einsen<br />

falls 8.Bit = 1 → restliche 7 Bit enthalten ungerade Anzahl <strong>von</strong> Einsen<br />

2. Erweiterter Zeichensatz → ANSI Extended ASCII<br />

Es gibt jedoch noch viele weitere Zeichen → kyrillisch, arabisch, chinesisch<br />

Rrightarrow Unicode<br />

2.2.2 Unicode<br />

• genormtes System zur Kodierung <strong>von</strong><br />

– Textzeichen (Buchstaben, Silbenzeichen, Ideogramme, Satzzeichen,<br />

Sonderzeichen, Ziffern)<br />

– mathematischen, kaufmännischen (z.B. Firmensymbole) und technischen<br />

Sonderzeichen<br />

• Versuch alle bekannten Zeichen aller Alphabete zu kodieren, neben<br />

lateinischen Zeichen auch Zeichen für griechisches, kyrillisches, arabisches,<br />

hebräisches und thailändisches Alphabet, japanische, chinesische,<br />

koreanische Zeichen auch tote Sprachen wie z.B. Hieroglyphen, Runen<br />

• Version 3.1 (März 2001) umfasst 94.140 Zeichen<br />

→ 3 Byte benötigt, 4 Byte verwendet (Reserve für zusätzliche Zeichen)<br />

⇒ großer (meist unnötiger) Speicherverbrauch<br />

⇒ Verwendung nur der ersten beiden Bytes (→ 65.536 Zeichen) für<br />

gebräuchliche Anwendungen (normale Kommunikation) ausreichend<br />

̂= UCS-2 (universal character set 2)<br />

14


⇒ Codierung mit variabler Länge → UTF-8 (unicode transformation<br />

format)<br />

– Wird nur 1 Byte verwendet ⇒ linkes Bit = 0<br />

→ 128 Zeichen kodierbar = ASCII-Zeichen z.B. 0xxxxxxx<br />

– Werden mehr Bytes benötigt (maximal 4)<br />

→ linkes Bit = 1 ∧ Anzahl der folgenden 1 mit Abschluss 0 gibt die<br />

Anzahl der noch zugehörigen Bytes an, die jeweils mit 10 beginnen<br />

Beispiel:<br />

0xxxxxxx (2 7 Zeichen)<br />

110xxxxx 10xxxxxx (2 11 Zeichen)<br />

1110xxxx 10xxxxxx 10xxxxxx (2 16 Zeichen)<br />

11110xxx 10 }{{} xxxxxx 10xxxxxx 10xxxxxx (221 Zeichen)<br />

bei gestörter Übertragung weiß man, dass hier nicht der Anfang sein<br />

kann<br />

2.3 <strong>Repräsentation</strong> ganzer Zahlen<br />

Bei heutigen Rechnern werden ganze Zahlen meist in 4 Byte = 32 Bit repräsentiert<br />

→ 2 32 = 4.294.976.296 Zahlen darstellbar<br />

Da man auch negative ganze Zahlen darstellen will<br />

→ Halbierung des darstellbaren Zahlenbetrags<br />

2.3.1 Darstellung durch Vorzeichen und Betrag<br />

VZ<br />

Betrag in 31 Bit<br />

VZ = 0 falls positive Zahl<br />

VZ = 1 falls negative Zahl<br />

⇒ darstellbarer Bereich<br />

−2 31 = −2.147.483.648 bis 2.147.483.648 = 2 31<br />

15


Nachteil: Addition und Subtraktion unterschiedlich<br />

z.B. 5 − 3 = 5 + (−3)<br />

00000101<br />

10000011<br />

10001000 ̂= − 8 Widerspruch<br />

2.3.2 Zweierkomplement-Darstellung<br />

Diese Darstellung wird am häufigsten verwendet.<br />

falls x ≥ 0 → 0 . . . x (als Binärzahl)<br />

falls x < 0 → 1 . . . y = 2 N − |x| (als Binärzahl)<br />

→ Zweierkomplement, da Komplement zu 2 N<br />

Y = 2 N − |x| = 2 N − 1 − |x| + 1=<br />

(111...11) 2 ̂= 2 N − 1<br />

-( x) 2 ̂= |x|<br />

+(00...001) 2 ̂= +1<br />

⇒ 2er-Komplement <strong>von</strong> |x| → Invertiere alle Bits <strong>von</strong> x und addiere 1<br />

Rückumwandlung: y = 2 N − |x| ⇔ |x| = 2 N − y ⇒<br />

analoge Vorgehensweise: Invertierung aller Bits und Addition <strong>von</strong> 1<br />

z.B. 5 − 3 = 5 + (−3)<br />

00000101 00000011<br />

+11111101 ↓Invertieren<br />

100000010 111111100<br />

↓ ↓Addition <strong>von</strong> 1<br />

Übertrag ignorieren 11111101 ̂=(−3)<br />

16


z.B. 3 − 5 = 3 + (−5)<br />

00000011<br />

11111011<br />

11111110 ̂= − 2<br />

↓ Invertieren<br />

00000001<br />

↓ Addition <strong>von</strong> 1<br />

00000010<br />

2.3.3 Einerkomplement-Darstellung<br />

Falls x ≥ 0 → 0 . . . x (als Binärzahl)<br />

17


Falls x < 0 → 1 y = 2 N − 1 − |x| (als Binärzahl)<br />

Invertiere für |x| alle Bits, analog Rücktransformation<br />

z.B. 3 − 5 = 3 + (−5)<br />

00000011 NR: 00000101<br />

11111010 ↓ Invertieren<br />

11111101 11111010 ̂=(−5)<br />

↓Invertieren<br />

00000010<br />

18


2.4 <strong>Repräsentation</strong> <strong>von</strong> Dezimalzahlen<br />

Wegen Beschränkung auf bestimmte Anzahl <strong>von</strong> Bits → kleiner Ausschnitt<br />

<strong>von</strong> R darstellbar.<br />

Festkommadarstellung: x } .{{ . . x}<br />

x } .{{ . . x}<br />

v Bits n Bits<br />

nicht gebräuchlich, da<br />

• bei kleinem v → keine großen Zahlen darstellbar<br />

• bei kleinem n → keine ganz kleinen Zahlen und Nachkommaanteile sehr<br />

ungenau darstellbar<br />

2.4.1 Gleitkommadarstellung<br />

m Mantisse<br />

B Basis<br />

e Exponent<br />

m · B e<br />

z.B.: 1, 245<br />

} {{ }<br />

m<br />

· 10 }{{}<br />

B<br />

bzw. im Binärsystem<br />

}{{}<br />

−<br />

Vorzeichen<br />

} 0.1101 {{ }<br />

m<br />

· 2 }{{}<br />

B<br />

e<br />

{}}{<br />

12<br />

e<br />

{}}{<br />

1010<br />

Darstellung nicht eindeutig:<br />

z.B. 1 2 = 0.1 · 20 = 0.01 · 2 1 = ... = 1.0 · 2 −1 = ... (Binärsystem)<br />

⇒normierte Darstellung<br />

z.B. 1 ≤ m < 2<br />

19


⇒ 1 2<br />

1<br />

4<br />

3<br />

4<br />

→ 1.0 · 2−1<br />

→ 1.0 · 2−2<br />

→ 1.1 · 2−1<br />

⇒ erstes Bit immer 1 →kann weggelassen werden (hidden Bit)<br />

⇒ eine Stelle mehr Genauigkeit, ohne höhere Kosten<br />

Seit 1985 IEEE Standard 754<br />

• einfache Genauigkeit (float → 32Bit)<br />

Da man sowohl große wie auch sehr kleine Zahlen darstellen will<br />

→ Exponent positiv und negativ<br />

Bei 2er-Komplement −128 ≤ e < 127<br />

z.B. Bei Addition muss Exponent verschoben werden →<br />

Exponent in versetzter Darstellung, d.h. implizit wird 127 abgezogen.<br />

z.B.: e = (10110000) 2 = 176 10 − 127 10 = 49 10<br />

⇒ −127 ≤ e ≤ 128 (eigentlich, aber -127 und 128 für spezielle Werte)<br />

2 −126 ...2 127 normalisierter Bereich<br />

Eine mit (se 7 ...e 0 m 22 ...m 0 ) dargestellte Gleitkommazahl hat den Wert<br />

(−1) s (1.m 22 ...m 0 )2 (e 7...e 0 −127)<br />

Frage: Wie stellt man 0 dar → geht so nicht direkt<br />

Frage: Warum steht der Exponent vor der Mantisse?<br />

Größenvergleich einfacher → analog ganze Zahlen, falls man<br />

e 7 ...e 0 m 22 ...m 0 als ganze Zahl auffasst.<br />

20


Neben den normalen Gleitkommazahlen gibt es spezielle Werte<br />

Exponent Mantisse Bedeutung<br />

-127 (0...0) 0...0 ±0 (keine normalisierte Darstellung möglich)<br />

-127 (0...0) ≠ 0...0 0.m · 2 −126 denormalisierte Zahl<br />

+128 (1...1) 0...0 ±∞ 1:0 > 4 → TRUE<br />

+128 (1...1) ≠ 0...0 NaN not a number z.B.: √ −1<br />

• doppelte Genauigkeit (double → 64 Bit)<br />

d.h.: (−1) s · 1.m · 2 e−1023 0 < e < 2047 (normalisierte Darstellung)<br />

(−1) s · 0.m · 2 −1022<br />

Falls e=0 (denormalisierte Darstellung)<br />

größte darstellbare Zahl: ≈ 10 308<br />

kleinste positive darstellbare Zahl: ≈ 10 −324<br />

2.4.2 Gleitkommaoperationen<br />

Multiplikation:<br />

Addit. der Expon.<br />

{ }} {<br />

m 1 2 r1 · m 2 2 r 2<br />

= m 1 m } {{ } 2 ·2 r 1 + r 2<br />

Multipl. der Mant.<br />

1. Bei Addition der Exponenten muss die versetzte Darstellung beachtet<br />

werden, d.h. 2 e1 · 2 e 2<br />

= 2 r 1+127 · 2 r 2+127 = 2 r 1+r 2 +127+127<br />

21


korrektes Ergebnis aber: 2 r 1+r 2 +127<br />

⇒ Addiere beide Exponenten und addiere dann (-127)<br />

2. Multiplikation der Mantissen<br />

- evtl. neu normalisieren<br />

Addit. der Expon.<br />

{ }} {<br />

z.B. 1.11 × 1.11 = 11.0001 → 1.10001 · 2 e + 1<br />

3. Vorzeichen s r = (s 1 + s 2 ) mod 2<br />

Addition:<br />

f = s 1 m 1 2 e 1<br />

+ s<br />

} {{ } 2 m 2 2 e 2<br />

} {{ }<br />

c<br />

d<br />

Beispiel:<br />

1.101 · 2 0 + −1.111 · 2 2<br />

(1.625) 10 − (7.5) 10 = (−5, 875) 10<br />

1. Falls e 2 > e 1 vertausche c und d<br />

−1.111 · 2 2 + 1.101 · 2 0<br />

2. Falls s 1 ≠ s 2 bilde 2er-Komplement <strong>von</strong> m 2<br />

(Falls m 1 negativ wird das Ergebnis (m 1 − m 2 ) später negiert → m 2 −<br />

m 1 )<br />

01.101<br />

↓ Inv.<br />

10.010<br />

00.001<br />

10.011 ̂=m 2 in 2er-Komplement<br />

3. denormalisiere m 2 durch Verschiebung um e 1 − e 2 nach rechts → beide<br />

Exponenten gleich<br />

arithm. Verschieben<br />

↗<br />

↘<br />

neg. Zahl → führende 1<br />

pos. Zahl → führende 0<br />

22


e 1 − e 2 = 2<br />

11.10011 · 2 2<br />

4. Addiere beide Mantissen<br />

01.11100<br />

11.10011<br />

(1)01.01111 ·2 2<br />

Überlauf ignorieren<br />

5. normalisiere Ergebnis 1.01111 · 2 2<br />

6. berücksichtige Vorzeichen:<br />

Falls s 1 ≠ s 2 ∧ s 1 = 1 → s f = 1<br />

−1.01111 · 2 2 = −5.875<br />

23

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!