Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen gezeigt.

Link zu dieser Vergleichsansicht

it:float [2011/11/30 12:56]
wikisysop
it:float [2012/06/08 13:02] (aktuell)
wikisysop
Zeile 1: Zeile 1:
 [[:it|{{ :​xeon.png?​40|}}]] [[:it|{{ :​xeon.png?​40|}}]]
 =====Gleitkommazahlen===== =====Gleitkommazahlen=====
-Bislang dachte ich, dass Rechnen alles ist was Computer können und das obendrein noch richtig schnell aber das dem offensichtlich nicht so ist, habe ich bei erlernen ​meiner ersten Programmiersprache (C) doch recht schnell herausgefunden. Schon beim studieren der Datentypen bin sehr rasch auf einige Unregelmäßigkeiten gestoßen.+Bislang dachte ich, dass Rechnen alles ist was Computer können und das obendrein noch richtig schnell aber das dem offensichtlich nicht so ist, habe ich beim Erlernen ​meiner ersten Programmiersprache (C) doch recht schnell herausgefunden. Schon beim studieren der Datentypen bin ich sehr rasch auf einige Unregelmäßigkeiten gestoßen. 
 + 
 +<note important>//<​fs x-small>​Dieser Artikel ist als Nebenprodukt beim Erlernen einer Programmiersprache entstanden und ich kann nicht sicherstellen,​ dass der Inhalt vollständig und inhaltlich korrekt ist. Sollten sich Fehler eingeschlichen haben oder anderweitige Verbesserungen an der ein oder anderen Stelle sinnvoll sein, bitte ich um Korrektur. Verwenden Sie hierfür bitte die Diskussionsplattform,​ am Ende des Artikels.</​fs>//</​note>​
  
 ====Das Problem==== ====Das Problem====
Zeile 30: Zeile 32:
 }</​code>​ }</​code>​
  
-Dieser Code gibt die Summen in der Variablendeklaration ​mit neun Nachkommastellen aus:+Dieser Code gibt die Summen ​der Addition bzw. Multiplikation ​in der Variableninitialisierung ​mit neun Nachkommastellen aus:
  
 <​xterm>​$ <fc #​008000>​./​float_2</​fc> ​ <​xterm>​$ <fc #​008000>​./​float_2</​fc> ​
Zeile 36: Zeile 38:
 1.210000038</​xterm>​ 1.210000038</​xterm>​
  
-Das erklärt zumindest mal das überraschende Ergebnis der Vergleichsoperation im ersten Programm aber befriedigend ist erst mal nicht. Das Ganze geht sogar noch einen Schritt weiter, lassen wir den Rechner mal nicht rechnen, sondern uns nur die interne Darstellung der beiden Zahlen >><​fc #​008000>​0,​1</​fc><<​ und >><​fc #​008000>​1,​1</​fc><<​ ausgeben:+Das erklärt zumindest mal das überraschende Ergebnis der Vergleichsoperation im ersten Programm aber befriedigend ist das erst mal nicht. Das Ganze geht sogar noch einen Schritt weiter, lassen wir den Rechner mal nicht rechnen, sondern uns nur die interne Darstellung der beiden Zahlen >><​fc #​008000>​0,​1</​fc><<​ und >><​fc #​008000>​1,​1</​fc><<​ ausgeben:
  
 <code c|float_3.c>#​include <​stdio.h>​ <code c|float_3.c>#​include <​stdio.h>​
Zeile 120: Zeile 122:
 Wie oben schon erwähnt wird bei der Normalisierung einer Dezimalzahl das Komma soweit nach links verschoben, bis nur noch eine Zahl ≠ 0 vor dem Komma stehen bleibt, dieser Grundsatz gilt auch im binären System. Da es im binären System neben einer >>​0<<​ nur noch eine >>​1<<​ gibt, ist somit die Vorkommastelle in jedem Fall eine >>​1<<​ und somit wurde in den Regularien von >>​IEEE 754<< festgelegt, dass auf die Vorkommastelle bei der Speicherung der Mantisse verzichtet wird. Dieses Weglassen der Vorkommastelle wird als >><​fc #​008000>​Hidden Bit</​fc><<​ bezeichnet. ​ Wie oben schon erwähnt wird bei der Normalisierung einer Dezimalzahl das Komma soweit nach links verschoben, bis nur noch eine Zahl ≠ 0 vor dem Komma stehen bleibt, dieser Grundsatz gilt auch im binären System. Da es im binären System neben einer >>​0<<​ nur noch eine >>​1<<​ gibt, ist somit die Vorkommastelle in jedem Fall eine >>​1<<​ und somit wurde in den Regularien von >>​IEEE 754<< festgelegt, dass auf die Vorkommastelle bei der Speicherung der Mantisse verzichtet wird. Dieses Weglassen der Vorkommastelle wird als >><​fc #​008000>​Hidden Bit</​fc><<​ bezeichnet. ​
 ==== ==== ==== ====
-So nun sind die Zutaten bekannt, jetzt kann man das mal an einem Beispiel demonstrieren. Nehmen wir mal die Zahl >>​23,​125<<;​ das Vorzeichen ist noch relativ einfach zu ermitteln, die Zahl ist positiv, dementsprechend ist das Vorzeichen-Bit >>​0<<​. Um nun diese reelle Zahl in eine normalisierte binäre Zahl zu bringen, rechnen wir erst einmal in eine Festkommazahl um:+So nun sind die Zutaten bekannt, jetzt kann man das mal an einem Beispiel demonstrieren. Nehmen wir mal die Zahl >>​23,​125<<;​ das Vorzeichen ist noch relativ einfach zu ermitteln, die Zahl ist positiv, dementsprechend ist das Vorzeichen-Bit >>​0<<​. Um nun diese reelle Zahl in eine normalisierte binäre Zahl zu bringen, rechnen wir sie erst einmal in eine Festkommazahl um:
  
 <​code|23,​125>​23 / 2 = 11 R 1 <​code|23,​125>​23 / 2 = 11 R 1
Zeile 133: Zeile 135:
 0,0   * 2 = 0,0  → 0</​code>​ 0,0   * 2 = 0,0  → 0</​code>​
  
-Somit haben wir das Zwischenergebnis >>''<​fc #​008000>​10111,​0010</​fc>''<<,​ welches nun noch **normalisiert** werden muss. Um nur eine Ziffer (≠ 0) vor dem Komma stehen zu haben, muss dass Komma um vier Stellen nach links verschoben werden, dass entspricht einer Multiplikation mit >>''<​fc #​008000>​2<​sup>​4</​sup></​fc>''<<​. Für die normalisierte Darstellung erhalten wir demnach: ''<​fc #​008000>​1,​0111001 * 2<​sup>​4</​sup></​fc>''​. Die Mantisse wird nun ohne der ersten >>​1<<​ gespeichert (>>​hidden bit<<​) und ergibt somit: ''<​fc #008000>10111001</​fc>'',​ die restlichen Stellen, werden mit Nullen aufgefüllt. ​+Somit haben wir das Zwischenergebnis >>''<​fc #​008000>​10111,​0010</​fc>''<<,​ welches nun noch **normalisiert** werden muss. Um nur eine Ziffer (≠ 0) vor dem Komma stehen zu haben, muss dass Komma um vier Stellen nach links verschoben werden, dass entspricht einer Multiplikation mit >>''<​fc #​008000>​2<​sup>​4</​sup></​fc>''<<​. Für die normalisierte Darstellung erhalten wir demnach: ''<​fc #​008000>​1,​0111001 * 2<​sup>​4</​sup></​fc>''​. Die Mantisse wird nun ohne der ersten >>​1<<​ gespeichert (>>​hidden bit<<​) und ergibt somit: ''<​fc #008000>0111001</​fc>'',​ die restlichen Stellen, werden mit Nullen aufgefüllt. ​
  
 Der Exponent ist >>''<​fc #​008000>​4<​sub>​10</​sub></​fc>''<<,​ was >>''<​fc #​008000>​100<​sub>​2</​sub></​fc><<''​ entspricht. Nun wird noch der >><​fc #​008000>​Bias</​fc><<​ (''<​fc #​008000>​127</​fc>''​) auf den Exponenten addiert: ''<​fc #​008000>​4<​sub>​10</​sub>​ + 127<​sub>​10</​sub>​ = 131<​sub>​10</​sub>​ = 10000011<​sub>​2</​sub></​fc>''​. Setzt man nun diese ermittelten Werte zusammen kommen wir zu folgendem Ergebnis: Der Exponent ist >>''<​fc #​008000>​4<​sub>​10</​sub></​fc>''<<,​ was >>''<​fc #​008000>​100<​sub>​2</​sub></​fc><<''​ entspricht. Nun wird noch der >><​fc #​008000>​Bias</​fc><<​ (''<​fc #​008000>​127</​fc>''​) auf den Exponenten addiert: ''<​fc #​008000>​4<​sub>​10</​sub>​ + 127<​sub>​10</​sub>​ = 131<​sub>​10</​sub>​ = 10000011<​sub>​2</​sub></​fc>''​. Setzt man nun diese ermittelten Werte zusammen kommen wir zu folgendem Ergebnis:
Zeile 275: Zeile 277:
 |  ''​1'' ​ |  ''​1111 1111'' ​ |  ''​000 0000 0000 0000 0000 0000'' ​ | ''​-∞'' ​ | |  ''​1'' ​ |  ''​1111 1111'' ​ |  ''​000 0000 0000 0000 0000 0000'' ​ | ''​-∞'' ​ |
 |  ''?'' ​ |  ''​1111 1111'' ​ |  ''​010 0110 0000 0000 0000 0100'' ​ | ''​NaN'' ​ | |  ''?'' ​ |  ''​1111 1111'' ​ |  ''​010 0110 0000 0000 0000 0100'' ​ | ''​NaN'' ​ |
 +
  
  --- //pronto 2011/11/30 00:50//  --- //pronto 2011/11/30 00:50//
 +{{keywords>​float gleitkomma mantisse exponent hidden bit bias}}
it/float.1322654216.txt.gz (17864 views) · Zuletzt geändert: 2011/11/30 12:56 von wikisysop
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0