Ich glaube, Du meinst Ma
ntisse, oder?
Das ist nicht schwer. Der Datentyp real ist eine Gleitkommazahl. D. h. wie der Name schon sagt, dass es ist nicht unbedingt eine ganze Zahl sein muss, sondern eine Kommazahl sein kann. (Im Gegensatz zu Integer, Long oder Byte) Das besondere an dieser Kommazahl ist, dass sie eine normierte Darstellung hat in der Form 1,23456... * 10^12, also allgemein
i,x * 10^n
D. h. das Komma steht immer direkt hinter der ersten Ziffer i. Und das wird dadurch erreicht, dass das Komma entsprechend lang verschoben wird. Damit die Zahl noch stimmt, musst du aber entsprechend oft mit 10 multiplizieren oder dividieren, was durch das 10^n ausgeglichen wird.
die
Mantisse ist nun das i,x. Also der reine Zahlenwert ohne den
Exponenten n. Die
Basis des Exponenten ist hier 10. Der Exponent ist für den Computer nicht 10, sondern 2. Genauso wie es für ihn nur die Ziffern 1 und 0 gibt. Noch allgemeiner lässt sich also schreiben:
Sei z die darzustellende Zahl, m die Mantisse, b die Basis und e der Exponent, so gilt:
z = m * b ^ e
Die Mantisse ist also der reine Zahlenwert, ohne dass du weißt ob der sich jetzt vielleicht 100 Stellen rechts oder links vom Komma befindet. Kommen wir also zum internationalen Standard IEEE754 von 1985:
Es gibt zwei Typen von Gleitkommazahlen: float und double. Float ist hierbei unter Pascal single. Double heißt, so weit ich mich erinnere unter Pascal auch double.
Eine float-Zahl besteht aus 32 Bit Information. Die 32 Bit verteilen sich auf 1 Bit Vorzeichen (also ob die Zahl positiv oder negativ ist), 8 Bit Exponent und 23 Bit Mantisse (in dieser Reihenfolge). Da nur Einsen und Nullen zur Verfügung stehen ist die Basis automatisch 2 und das Zahlensystem das Zweiersystem. Der sog.
Bias beträgt 127. Wozu der Bias gut ist, erkläre ich weiter unten. Diese Dimensionen sind scheinbar willkürlich festgelegt worden. Wenn Du Dich tiefer mit der Materie befasst, wirst Du recht schnell sehen, dass diese Werte gar nicht so willkürlich sind.
Wie interpretier ich nun so eine Zahl?
Wie wir bereits wissen, legt das Vorzeichenbit fest, ob die Zahl positiv oder negativ ist. Dabei steht 1 für Minus und 0 für Plus. Dass das so, und nicht andersrum festgelegt ist, hat seinen Sinn.
Nachfolgend kommen 8 Bit Exponent. Wir wissen, dass die Basis 2 beträgt. Der Exponent selbst hat aber kein Vorzeichenbit. D. h. wir können im Exponenten nicht z. B. -11 schreiben. Um aber Zahlen <1 darzustellen, braucht man einen negativen Exponenten. Und dafür gibt es den Bias. Der Exponent, den wir aus den 8 Bit ablesen können, ist nämlich nicht der Exponent, mit dem wir rechnen. Wir müssen vorher noch den Bias abziehen.
Unklar? Hier ein Beispiel:
wir haben den Exponenten
10010011
umgerechnet in das für uns lesbare Dezimalsystem ist das 128+16+2+1 = 147
Von 147 wird nun noch der Bias, also 127 abgezogen. Also 147-127 = 20
20 ist folglich der Exponent, der tatsächlich gemeint ist. Die Zahl ist absichtlich blau, um kenntlich zu machen, dass es sich um eine Binärzahl handelt. Sonst kommen wir da noch durcheinander.
Es folgt zum Schluss die Mantisse mit 23 Stellen. Wir wissen, dass das Komma direkt hinter der ersten Ziffer steht. Daher wird dieses Komma nicht gespeichert. Außerdem wissen wir, dass es im Binärsystem nur Nullen und Einsen gibt. Deswegen muss die erste Ziffer eine 1 sein. Führende Nullen lässt man schließlich weg. Man schreibt ja auch nicht 0000004711, sondern 4711. Und da wir das wissen, wird die erste Ziffer auch nicht gespeichert. Das heißt vor den 23 Bit der Mantisse m müssen wir noch 1, einfügen. So dass dann dasteht 1,m.
Sei die Mantisse m = 00010011100000000000000
wir ergänzen also 1, vornedran, dann steht da
1,00010110000000000000000
(Im Dezimalsystem wäre das: 1 + 1/16 + 1/64 + 1/128 = 1,0859375)
Bei dieser Binärzahl wird nun das Komma so oft nach links bzw. rechts verschoben bis der Exponent 0 ist. Im obigen Beispiel ergäbe sich also
100010110000000000000,000
und das ist also die Zahl, die kodiert wurde. (Dezimal auch 1138868)
Das heißt die Zahl ist in diesem Beispiel zufällig eine ganze Zahl.
Noch ein Beispiel: Gegeben sei die dezimale Zahl -21,3330078125
kodiert wird nun so:
Das Vorzeichenbit ist 1. Die Zahl ist ja negativ. Als nächstes muss die Mantisse in eine Dualzahl umgewandelt werden. Hierzu teilen wir sie auf in einen Teil vor dem Komma (42) und einen Teil nach dem Komma (3330078125). Die 21 berechnet sich indem wir nacheinander immer wieder durch 2 teilen, und die Reste von rechts nach links notieren:
21 : 2 = 10 R 1
10 : 2 = 5 R 0
5 : 2 = 2 R 1
2 : 2 = 1 R 0
1 : 2 = 0 R 1
D.h. dezimal 21 ist binär
10101. Ähnlich beim Nachkommateil, nur dass wir Multiplizieren statt zu Dividieren und eine eventuell auftauchende Vorkommastelle als Rest behandeln:
0,3330078125 * 2 = 0,666015625 -> 0
0,666015625 * 2 = 1,33203125 -> 1
0,33203125 * 2 = 0,6640625 -> 0
0,6640625 * 2 = 1,328125 -> 1
0,328125 * 2 = 0,65625 -> 0
0,65625 * 2 = 1,3125 -> 1
0,3125 * 2 = 0,625 -> 0
0,625 * 2 = 1,25 -> 1
0,25 * 2 = 0,5 -> 0
0,5 * 2 = 1 -> 1
glücklicherweise kommen wir zu einem Ende. Andernfalls hätten wir ewig weiterrechnen können und hätten uns dann mit einer begrenzten Genauigkeit begnügen müssen.
die Mantisse ist also (inklusive Komma)
10101,0101010101 (rein zufällig so regelmäßig
)
jetzt müssen wir aber das Komma noch verschieben. Nämlich so, dass es unmittelbar rechts von der linkesten Eins ist. Also
10101,0101010101 =
1,01010101010101 * 2^4
Daraus folgt die Mantisse m, die gespeichert wird ist 01010101010101
Den Exponenten müssen wir noch berechnen. Wir wissen 4 ist binär
100. Der Bias beträgt 127 oder binär
1111111
1111111 + 100 = 10000011 Und das ist dann unser Exponent, den wir speichern.
Ist eine Mantisse (Exponent) kürzer als 23 (8) Stellen, füllt man sie von rechts (von links) mit Nullen auf.
D.h. unsere dezimale Zahl -21,3330078125 ist als float geschrieben:
11000001101010101010101000000000
Bei double precision ist's nicht viel anders, nur mit 64 Bit, darunter 11 Bit Exponent, 52 Bit Mantisse und ein Bias von 1023. Zu beachten ist: Die Null ist so nicht darstellbar. Es gibt dafür aber eine Sonderkombination. Ebenso gibt es Spezialkombination für Division durch 0 bzw. +-unendlich. Außerdem kann es passieren, dass Zahlen, die dezimal ganz harmlos aussehen, ein binäres Chaos ergeben und Genauigkeit verloren geht. So kann es passieren, dass z. B. 0,2 umgewandelt in eine Gleitkommazahl und wieder zurück nur 0,1999... ergibt.
Noch Fragen?
Ich kann Dir fast alles über diese Zahlen sagen, hab schon ganze Seiten mit den Dingern gerechnet, Automaten entworfen, die damit rechnen, Assemblerprogramme geschrieben, die das schnellstmöglich umwandeln und Algorithmen, die effizient damit rechnen. Ist quasi mein täglich Brot.
PS: Was ich vorhin über das Vorzeichenbit der Mantisse mit dem Zweierkomplement und leichter rechnen geschrieben hab, vergiss schnell wieder. Hab da vorhin drüber nachgedacht und da kam mir, dass das Unsinn war. In der Richtung ist schon was möglich, aber nicht so direkt, wie man meinen könnte und ich glaube für deine Zwecke daher etwas zu kompliziert.