Gleitpunktzahlen: Unklarheiten

  • Hallo,
    es wäre schön, wenn ihr mir mal mit meinen Fragen zu Gleitpunktzahlen weiterhelfen könntet.

    Folgendes ist mir bisher noch relativ unklar:

    1.
    Das Vorzeichenbit einer Gleitpunktzahl gibt an, ob diese negativ oder positiv ist. Es handelt sich also auch hier einfach um eine Zweierkomplementdarstellung?

    2.
    Die Position des Dezimalpunktes ergibt sich aus dem Exponenten in der technisch-wissenschaftlichen Schreibweise einer Zahl.
    In der Binärdarstellung sind dann bspw. 8 Bit für diesen Exponenten reserviert.

    Nun bin ich mir aber nicht ganz sicher über den Umgang des Systems mit diesem Exponenten:

    2.1
    Wenn das System eine Zahl geliefert bekommt, wie stellt es dann den Wert des Exponenten fest?

    2.2
    Wie wird eine dezimale Gleitpunktzahl in eine binäre umgewandelt und andersrum?

    2.3
    Was passiert, wenn 2 Zahlen mit unterschiedlichen Kommastellen addiert werden?

    z.B.:

    86,538
    + 4,7223

    Zu einer Überschreitung des Zahlenbereiches kann es bei so einer Rechnung ja eigentlich nicht kommen, weil für die Binärdarstellung ja der Zahlenbereich der Zahl mit dem höheren Exponenten (86,538) bentuzt werden muss.

    Wie verhält es sich hier mit dem Exponenten der Summe?
    Wird immer automatisch der größte Exponent aus den Summanden (hier 2) auch für das Ergebnis gewählt? Wäre sinnvoll. Aber andererseits könnte man das Ergebnis auch als 0,086538*10^3 oder 865,38*10^-1 darstellen.

  • Das Vorzeichenbit einer Gleitpunktzahl gibt an, ob diese negativ oder positiv ist. Es handelt sich also auch hier einfach um eine Zweierkomplementdarstellung?


    Nein, üblicherweise sign-magnitude ("Vorzeichen und Betrag"). Hat auch genau ein Vorzeichenbit, wie auch andere (aber nicht alle) Verfahren zur Darstellung negativer Zahlen.

    Zitat

    Wenn das System eine Zahl geliefert bekommt, wie stellt es dann den Wert des Exponenten fest?


    Der ergibt sich aus der Zahl der Stellen vor dem Punkt bzw. der Zahl der Nuller hinterm Punkt. Wenn etwa vor dem Punkt die Zahl 7 steht, wird der Punkt um 3 verschoben, weil 3 Bits notwendig sind, um 7 darzustellen.

    Zitat

    Wie wird eine dezimale Gleitpunktzahl in eine binäre umgewandelt und andersrum?


    Anschaulich gesehen kannst du mal den ganzzahligen und den gebrochenen Teil voneinander getrennt betrachten. Der ganzzahlige Teil wird wie gewohnt umgewandelt. Der gebrochene Teil so ähnlich, nur daß du ihn aus negativen Zweierpotenzen zusammensetzt: Statt zu schauen, wie du die Zahl als Summe von 1, 2, 4, 8 usw. formen kannst, nimmst du stattdessen 1/2, 1/4, 1/8 etc. Bei der Rückrechnung werden entsprechend die Bits hinter dem Punkt mit dem jeweiligen Bruch multipliziert.

    Z.B. die Umwandlung von 1.6 dezimal nach binär mit fünfstelliger Mantisse: Der ganzzahlige Teil 1 braucht ein Bit, es bleiben also vier Bits hinterm Punkt. Wir sehen uns 0.6 an: Da passt 1/2 hinein, also ist das erste Bit hinterm Punkt 1, und es bleibt 0.1 zum Umwandeln. Der nächste Bruch, 1/4, geht nicht in 0.1 hinein; auch nicht der übernächste, 1/8. 1/16 geht in 0.1 hinein, also ist das vierte Bit hinterm Punkt wieder 1. Es bleibt ein Rest, aber wir haben bereits alle Mantissenbits verbraucht, also wird abgeschnitten. Wir kriegen als Ergebnis 1.1001.

    Um wieder ins Dezimalsystem zu kommen, rechnen wir: 1 + 1/2 + 0/4 + 0/8 + 1/16 = 1.5625. Das ist die beste Annäherung, die wir mit so wenigen Mantissenbits hinkriegen.

    Zitat

    Was passiert, wenn 2 Zahlen mit unterschiedlichen Kommastellen addiert werden?
    [...]
    Wie verhält es sich hier mit dem Exponenten der Summe?
    Wird immer automatisch der größte Exponent aus den Summanden (hier 2) auch für das Ergebnis gewählt?


    Nein. Während der Berechnung wird zwar auf den größten Exponenten gebracht, aber das Ergebnis wird üblicherweise wieder normalisiert gespeichert.

    *plantsch*

  • @plantschkuh: Vielen Dank für die ausfürlichen Erklärungen!


    Ich bin inzwischen etwas tiefer in die Thematik eingetaucht und es haben sich konkretere/weitere Fragen ergeben:

    Zitat

    das Ergebnis wird üblicherweise wieder normalisiert gespeichert

    1.
    Wie ist eigentlich die Definition von "normalisiert" bzw. "normiert"?

    1.2
    0 lässt sich nicht als normierte (Gleitpunkt-)Zahl darstellen, weil die erste stelle einer normieren Zahl immer ungleich 0 ist (warum auch immer).
    Aber als nicht-normierte Gleitpunktzahl (short real) würde dass dann doch etwa so aussehen:

    V..E................M
    0 00000000 00000000000000000000000


    2.
    Entspricht single short real und double long real?

    3. Zur Darstellung des Exponenten:

    Der wird ja zumeist als Exponent + Bias gespeichert. Bei short real beträgt der Biaswert 127, bei long real 1023.

    Nun bin ich auf folgenden Widerspruch gestoßen:
    Bei einer Zahl mit 8-Bit-Exponent ist der kleinste möglich Exponent -128, der größte 127. Aber wie kann das sein, wenn der Exponent immer als Summe von e + 127 gespeichert wird?
    Wenn e bspw. mal 120 wäre, wäre die Summe ja gar nicht mehr mit 8 Bit darstellbar. Der größte mögliche Exponent wäre demnach 0. 80

  • Wie ist eigentlich die Definition von "normalisiert" bzw. "normiert"?


    Wie du selber schreibst, heißt eine Zahl dann normiert, wenn das erste Bit der Mantisse 1 ist. Der Grund dafür ist folgender: Wenn wir wissen, daß dieses Bit immer 1 ist, dann brauchen wir das Bit gar nicht speichern! Man kriegt also, wenn man immer normierte Zahlen verwendet, ein Mantissenbit gratis.

    Zitat

    0 lässt sich nicht als normierte (Gleitpunkt-)Zahl darstellen


    Richtig. Da gibts irgendwelche Übereinkünfte, wie 0 dargestellt werden soll; ich hab vage was von lauter 0-Bits in der Mantisse und dem kleinstmöglichen Exponenten im Kopf. Das wären dann also tatsächlich nur 0-Bits, was man in Hardware auch sehr effizient feststellen kann. Ich weiß aber nicht, ob ich mich da richtig erinnere.

    Zitat

    Entspricht single short real und double long real?


    Die Begriffe sagen mir nicht viel, wo hast du sie her? Wenn short/long real aus dem IEEE-Standard oder der Architekturbeschreibung eines Prozessors stammen, und mit float/double die Typen von C, C++ oder ähnlichem gemeint sind: Ja, von den Namen her klingt das so. Compiler haben aber oft eine gewisse Flexibilität bei der Auswahl von Datentypen. Zum Beispiel könnte ein C-Compiler für float und double den selben Typen wählen.

    Zitat

    Der wird ja zumeist als Exponent + Bias gespeichert. Bei short real beträgt der Biaswert 127, bei long real 1023.

    Nun bin ich auf folgenden Widerspruch gestoßen:
    Bei einer Zahl mit 8-Bit-Exponent ist der kleinste möglich Exponent -128, der größte 127. Aber wie kann das sein, wenn der Exponent immer als Summe von e + 127 gespeichert wird?
    Wenn e bspw. mal 120 wäre, wäre die Summe ja gar nicht mehr mit 8 Bit darstellbar. Der größte mögliche Exponent wäre demnach 0. 80


    Ich denke, der Bias bei 8 Bit sollte 128 sein. Dann entspricht das Bitmuster 00000000 dem Exponenten -128, das Bitmuster 1000000 dem Exponenten 0, und das Bitmuster 11111111 dem Exponenten 127. Der Exponent 120 wäre als 128 + 120 = 248 mit 8 Bits darstellbar. Wenn der Bias doch 127 ist, sind diese Bitmuster um 1 daneben, aber auch 127 + 120 passt in 8 Bits.

    *plantsch*

  • Zitat von Plantschkuh!

    Wie du selber schreibst, heißt eine Zahl dann normiert, wenn das erste Bit der Mantisse 1 ist.

    Ja, aber das erklärt ja noch nicht, was Normierung einer Zahl genau bedeutet.
    Und die Möglichkeit ein Mantissenbit einzusparen ergibt sich dann aus dieser Normierung, aber sie (die Möglichkeit der Einsparung) ist nicht der Grund dafür, dass das erste Bit 1 ist, glaube ich.

    Wikipedia sagt bspw.:

    Zitat

    Die Lichtgeschwindigkeit im Vakuum beträgt c = 299.792.458 m/s = 299.792,458·10^3 m/s = 0,299792458·10^9 m/s = 2,99792458·10^8 m/s. Nur der letzte Wert ist normalisiert.

    Heißt Normalisierung also immer, dass die vor dem Komma eine Zahl ungleich 0 stehen muss?
    Wäre 29,9792458·10^7 dann auch eine norm(alis)ierte Zahl?

    Zitat

    Da gibts irgendwelche Übereinkünfte, wie 0 dargestellt werden soll;


    Ich habe gelesen, dass die kleinste darstellbare (normierte?) Gleitpunktzahl immer als 0 interpretiert wird.

    Zu den Begriffen short real und long real:

    Das sind zwei IEEE-Standards, der erste mit 8-Bit-Exponent und 23-Bit-Mantisse und der zweite mit 11-Bit-Exponent und 52-Bit-Mantisse.

    Macht (+ Vorzeichenbit) jeweils 32 bzw. 64 Bit insgesamt.

    Hierzu hab ich in Wikipedia noch gefunden:

    Zitat

    In der Norm IEEE 754 werden zwei Grunddatenformate für binäre Gleitkommazahlen mit 32 Bit (single precision) bzw. 64 Bit (double precision) Speicherbedarf und zwei erweiterte Formate definiert.

    Dürfte also das selbe sein.

    Zitat

    Ich denke, der Bias bei 8 Bit sollte 128 sein.


    Das glaube ich nicht, denn die Addition des Bias geschieht ja sicherlich im Zweierkomplementsystem (auch wenn das Ergebnis vorzeichenlos gespeichert wird), weil der Exponent auch negativ sein kann.
    128 ist aber als Zweierkomplemet mit 8 Bit nicht darstellbar (-128 bis -1; 0 bis 127).
    Allerdings wäre selbst der Exponent 127 mit einem Bias von 128 (oder auch andersrum) noch in dieser Weise darstellbar (255). Komisch. Ich glaube, das hat etwas mit der Darstellung der 0 zu tun. Fällt dadurch nicht eine Zahl weg?

  • Soo: Warum ist der Biaswert 127 bzw. 1023? Ganz einfach:

    Entgegen meiner bisherigen Annahme, lassen sich in einem 8-Bit-Exponenten nur die Zahlen -126 bis 127 darstellen (bei 1023 sind das -1022 bis 1023).

    Das ist so, weil

    die (Biased-)Exponenten 0000 0000 und 1111 1111 (bzw. das ganze mit 11 Bit) für spezielle Zwecke gebraucht werden.
    Das macht auch deshalb Sinn, weil man -128 + 127 gar nicht vorzeichenlos darstellen kann.

    Dann nochmal zu der Sache mit dem hidden bit:

    Ich verstehe, dass man das einsparen kann, weil eine normierte Zahl dieses Bit immer impliziert.
    Das heißt aber auch, dass die Mantisse z.B. bei single precision eigentlich 24 (und nicht 23) Bit lang ist.
    Müsste die Mantisse mit den 23 explizit gespeicherten Bits dann nicht den Betrag der darzustellenden Zahl - 2^n (n = Anzahl der Bits) beinhalten?

  • Nochmal 2 Fragen zum Thema:

    1.
    Ist die Umwandlung von dezimal nach binär die einzige Fehlerquelle bei Gleitpunktsystem? Ich meine in der Rechnung wird sich der Umwandlungfehler dann evtl. irgendwie potenzieren, sodass eine noch größere Ungenauigkeit erzeugt wird, aber trotzdem ist das anscheinend der einzige Auslöser für Fehler in diesem System.

    2.
    Ich habe gelesen, dass das Rechnen mit Gleitpunktzahlen zu "leichter bis absoluter" Ungenauigkeit führen kann.
    Wo ist denn da der Unterschied?

    Vielleicht kann auch nochmal jemand auf meine letzte Frage aus dem obigen Post eingehen.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!