FloatingPoint Zahlen (IEEE754) < Technische Inform. < Praktische Inform. < Hochschule < Informatik < Vorhilfe
|
Status: |
(Frage) beantwortet | Datum: | 20:30 Do 07.04.2005 | Autor: | brace |
Ich habe diese Frage in keinem Forum auf anderen Internetseiten gestellt.
Hallo erstmal,
da das meine erste Frage in diesem Forum ist, wollte ich vorweg schon einmal Danke sagen für die Hilfe, die ich hier (hoffentlich ) finde. Ich finde dieses Forum super (und besonders die Idee, dass jeder mal der Helfende und mal der Fragende ist). Also starte ich erstmal als Fragender:
Ich beschäftige mich gerade mit floating point Zahlen und damit, wie man beliebige Dezimalzahlen wie -12,7 als floating points nach IEEE 754 darstellt. Ich hab jetzt schon ne Menge rumgerechnet und geübt und fühl mich auch schon etwas sicherer, ich habe da aber noch 2 (Verständnis-)Fragen:
1. Zum bias: Warum führt man diesen bias ein ? Ich habe schon verstanden, dass der bias es erlaubt, dass man auch negative Exponenten schreiben kann, aber könnte man das nicht auch, indem man für den Exponenten eine Zweierkomplementdarstellung benutzt ? Ich vermute, dass man sich da etwas bei gedacht hat und dass die Darstellung des Exponenten im Zweierkomplement irgendeinen Nachteil hat, aber welchen ? Hat das was damit zu tun, dass man floating point numbers besser vergleichen kann, wenn man mit bias arbeitet ? Ein Freund hat dieses Stichwort irgendwo mal aufgeschnappt, wusste aber nicht mehr, ob es überhaupt mit dem bias zu tun hat.
2. Ich bin in einem Buch auf folgendes gestoßen: Der Autor schreibt, dass man nicht jede ganze Zahl exakt als floating punkt Zahl darstellen kann, und dass man dann mit der floating point number arbeitet, die am nächsten dran ist. Leider bringt er kein Beispiel. Ich habes mal mit 678 probiert: 678 ist (binär) 1010100110 oder normiert 1.01010011 [mm] \* 2^{9}. [/mm] Und weil 678 positiv ist, ist die Darstellung nach IEEE754 einfach 00000100101010011000000000000000 (oder ?). Mir fällt kein Beispiel ein, dass nicht geht. Ich weiß, dass 0.1 nicht exakt darstellbar ist, weil 0.1 binär auf einmal periodisch ist. Gibt es so etwas ähnliches auch bei ganzen Zahlen ? Kennt irgendjemand ein Beispiel bei dem die Umwandlung nicht geht (zumindest nicht exakt), zB weil ich nicht mit 32 Bit auskomme oder ähnliches ?
Bin für jeden Hinweis dankbar, geht nicht um Leben oder Tod, aber das ganze würde mein Verständnis etwas abrunden .
Liebe Grüsse
brace
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 10:00 Fr 08.04.2005 | Autor: | bazzzty |
Im wesentlichen zwei Treffer.
Zum bias: Ich kann nicht mit Sicherheit sagen, daß das der einzige Grund ist, aber da bei Floating-Point-Zahlen der Exponent an den höheren Stellen gespeichert wird, und gleichzeitig die Mantisse in aller Regel normalisiert ist, kann man bei Zahlen gleichen Vorzeichens einfach vergleichen, weil der Vergleich von Mantisse*2^(Exponent-bias) dasselbe Ergebnis hat wie der Vergleich von Exponent.Mantisse.
Zum zweiten Punkt: Die Auflösung von Floating-Points ist durch die Länge der Mantisse beschränkt. Wenn man z.B. die größte darstellbare ganze Zahl nimmt, dann besteht sie aus lauter 1en in der Mantisse und im Exponenten (MAXFLOAT). Die Zahl (MAXFLOAT- 1) ist aber nicht darstellbar, weil sie sich von ihr nur an der (Exponent-bias)ten Stelle von MAXFLOAT unterscheidet, das liegt weit jenseits der Auflösung der Mantisse.
Heißt: Eine Zahl X ist grob gesagt immer nur von Zahlen unterscheidbar, die sich um mindestens X/2^(Mantissenlänge) unterscheiden.
Unabhängig davon kannst Du natürlich auch einfach den Wertebereich sprengen, aber das ist doch zu einfach ;)
Ich hoffe, das hilft, sonst frag nach!
Gruß, Bastian
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 18:04 So 10.04.2005 | Autor: | brace |
Hallo Ihr beiden,
ich war leider das ganze Wochenende weg und konnte eure Antworten erst heute lesen. Beides hat mir wirklich sehr (!) geholfen. Ich hab mich mal mit MAXFLOAT hingesetzt und mir das klargemacht, ich seh jetzt endlich das Problem. Das war echt super, danke.
Über ein paar Details aus deiner Antwort, Bastian, muss ich heute (oder morgen ) aber nochmal nachdenken. Ich hoff, ich darf dann wieder nachhaken (weiß nicht genau, wann ich dazu komme). Bis dahin schonmal vielen, vielen Dank an euch !
Gruß, Brace
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 16:41 Do 14.04.2005 | Autor: | brace |
Hallo Bastian (oder andere),
ich hoffe, du liest das hier nochmal. Wie gesagt, ich finde, mein Problem ist schon gelöst, ich hab nur noch die eine oder andere Frage zum Detail. Das Beispiel mit MAXFLOAT hat mir sehr geholfen und ich hab es mir auch an der 32 Bit Version selbst klar gemacht, ich glaube aber meine Frage kann ich leichter stellen, wenn ich eine etwas abgespecktere Version nehme. Also: nehmen wir mal an, ich hätte zur Darstellung von floatingpoint-zahlen nur 6 Bits zur Verfügung, die ich wie folgt aufteile: 1 Vorzeichenbit, 3 Bits für den Exponenten, 2 Bits für die Mantisse. Dann wäre MAXFLOAT ja 011111, was 1.11 [mm] \* 2^{7-3} [/mm] = 11100 = 28 entspräche (der bias wäre ja 3). MAXFLOAT - 1 wäre dann 27 = 11011 = 1.1011 [mm] \* 2^{4} [/mm] und das Problem wäre, dass ich von den 4 nötigen Nachkommastellen nur 2 wirklich darstellen kann. D.h. ich kann nur 1.10 [mm] \* 2^{4} [/mm] = 24 oder 1.11 [mm] \* 2^{4} [/mm] = 28 darstellen.
Eine meiner ersten Nachfragen ist übrigens, ob du weißt, wie nun gerundet wird. Ich meine, wenn ich 27 darstellen will, aber nur 24 oder 28 darstellen kann, werde ich wohl 28 nehmen, aber wie sind da genau die Regeln ? Wird 1.1011 zu 1.11 aufgerundet (und 1.1001 würde zu 1.10 abgerundet) oder schneidet man einfach die nicht darstellbaren Nachkommastellen ab ? (dann würde 1.1011 ja zu 1.10, so dass ich auf 24 abrunde).
Eine andere Frage noch zu deiner Angabe, dass sich "MAXFLOAT und MAXFLOAT-1 nur an der (exponent-bias). Stelle unterscheiden". Das ist ja bei meinem Beispiel mit 28 und 27 nicht ganz richtig, oder ? Sie unterscheiden sich dort eher ab der (exponent-bias+1). Stelle (von "vorne" gezählt). Ich frag nur, weil ich so präzise Angaben eigentlich echt super finde und nur fragen wollte, ob du nochmal nachgucken kannst, was von beiden stimmt. Ich neig dazu, zu denken, dass ich was verstanden hab und hab's in Wirklichkeit noch nicht verstanden. Und an solchen Stellen kann man das gut feststell'n (ob oder ob nicht ).
Ich hab mir mal angeguckt, welche Zahlen ich mit meinen 6 Bit und den 2 Mantissenbits so darstellen kann und das Ergebnis ist, dass ich 28, 24, 20 usw. darstellen kann, dh. die darstellbaren Zahlen haben alle den Abstand 4. Und daraus ergibt sich meine (hoffentlich) letzte Frage: das ist ja [mm] 2^{mantissenlaenge} [/mm] (also hier: [mm] 2^{2}). [/mm] Ist das immer so ? Der letzte Teil deiner Antwort klingt so. Das würde ja bedeuten, dass ich mit 23 Bit Mantissen nur ganze Zahlen im Abstand [mm] 2^{23} [/mm] darstellen könnte, was wahrscheinlich nicht stimmt, oder ? Ich fände super, wenn man sagen könnte: "Hey, ich habe 17 Bits für meine Mantisse, das bedeutet, die ganzen Zahlen, die ich darstellen kann, müssen einen Mindestabstand von k haben". Allerdings vermute ich, dass das k auch noch vom Exponenten abhängt. Kannst du da noch was zu sagen ? Am besten ruhig an so nem Beispiel wie mit den 6 Bit, die ich hier habe.
Natürlich darf auch jeder andere drauf antworten, wenn er mag und Zeit hat . Wie vorher ist es einfach Neugier, es geht nicht um Leben und Tod. Schon jetzt ein "Danke" an alle, die sich damit auseinandersetzen.
Ich habe die Frage in keinem anderen Forum gestellt.
Gruß
brace
|
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 19:14 Do 14.04.2005 | Autor: | bazzzty |
Hi brace,
ich bin leider nicht fit genug, um Dir zu sagen, nach welchen Verfahren gerundet wird. Das ist aber durch die IEEE-Standards geregelt (und müßte sich dort finden lassen, wenn nicht jemand anders hier mehr Ahnung hat)
Zur Unterscheidung von MAXFLOAT und MAXFLOAT-1: Da hast Du recht, ich hätte präziser schreiben sollen, daß sich die Zahlen *überhaupt* noch jenseits des dargestellten Bereiches unterscheiden. Ich hatte darauf gehofft, daß Du sehen würdest, was da passiert, und da hast Du mich ja auch nicht enttäuscht.
Zum letzten Punkt: Du hast das schon richtig gesehen, von der 28 ausgehend kannst Du nur Zahlen in Viererabständen darstellen, aber Du bist schon genau auf dem richtigen Dampfer, was den Exponenten angeht.
Fang mal mit dieser Frage an:
Wenn der Exponent eins kleiner ist (6-3), was ist dann die größte Zahl, und was die nächstkleinere. Was gilt allgemein für den Exponenten (x-3)?
Tipp: Die Frage, welche Abstände von einer Zahl darstellbar sind (ohne eine Zweierpotenz zu kreuzen! - Warum?) hängt nur ab vom Exponenten und der Länge der Mantisse.
.
.
.
.
.
.
.
Hier nicht weiterlesen, bevor Du was ausgerechnet hast!!
.
.
.
.
.
.
.
.
.
Um Dich selbst zu kontrollieren: Die 4 Abstand zwischen 28 und 24 sind nichts anderes als [mm]2^{(7-3)-2}[/mm]!
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 17:45 Fr 15.04.2005 | Autor: | brace |
Hallo Bastian,
vielen Dank für deine prompte Antwort. Ich denk, jetzt hab ich das System verstanden und dabei auch noch entdeckt, dass die Zahlen zur 0 hin dichter liegen als am Rand. Ich finde, das macht Sinn, weil es bei sehr großen Zahlen wahrscheinlich nicht ganz so auf genaue Nachkommastellen ankommt wie bei sehr kleinen Zahlen. Oder ?
Das mit dem Runden würd ich allerdings noch gern verstehen. Ich hoffe, irgendjemand kennt sich damit aus. Auf alle Fälle vielen Dank für deine Hilfe.
Gruss
Brace
|
|
|
|
|
Hi!
FloatingPoint-Zahlen werden nach IEEE Rule P754, der sogenannten "Banker's Rule", gerundet.
Und bevor ich hier jetzt was unvöllständiges behaupte, empfehle ich einfach mal mein Numerik-Skript. Die Banker's Rule findet man auf Seite 8.
http://www.mathematik.uni-ulm.de/numerik/teaching/ss04/Numerik1a/Numerik1a.pdf
Gruss,
Michael
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 23:13 Di 19.04.2005 | Autor: | brace |
Hallo Michael,
sorry, hatte in den letzten Tagen ziemlich viel um die Ohren und bin doch noch ein "Danke" schuldig. Ich muss gestehen, dass ich mir die Regel nochmal ganz in Ruhe ansehn muss, so ohne Beispiel im Binärsystem verstehe ich das leider noch nicht. Ich hab schon Beispiele im Dezimalsystem gesehen, das war recht einfach, aber mit binären Ziffern, naja.... Aber immerhin hab ich jetzt eine Regel, an der ich mich abarbeiten kann. Also: vielen Dank für diesen Hinweis.
Gruß
Brace
|
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 12:36 Fr 08.04.2005 | Autor: | Aly |
Hallo,
Bias:
Das Bias-Format hat den Vorteil, dass der Exponentenvergleich besonders einfach ist, und das wegen der alphabetischen Ordnung der Zahldarstellungen, will man zwei Zahlen vergleichen so sucht man die höchstwertige Stelle wo sich diese Zahlen unterscheiden, die grössere Zahl ist dann diejenige die an dieser Stelle eine 1 hat. Bei Zweierkomplement wäre das so direkt nicht möglich, da man zwischen negativen und positiven Zahlen erstmal unterscheiden muss und dann alphabetisch vergleichen . aber das ist nicht der einzige Grund. Eine andere Argumentation wäre meiner meinung nach z.B dass man bei Addition zweier Zahlen die Exponenten angleichen muss. Bei zweier komplement ist das komplizierter, wenn einer der Exponenten negativ wäre und der andere positiv. In der Bias darstellung ist nur substraktion angesagt, kommt dabei eine Zahl x raus so muss man die Bits der Mantisse der entsprechenden Zahl um |x| nach links(bzw. nach rechts) verschieben
Ganze Zahlen als Fließkommazahlen:
Wenn man eine ganze zahl wählt, die mehr Bits beansprucht als in der Mantisse zur Verfügung steht, dann muss man auf Genauigkeit verzichten. Die IEEE-754 Darstellung stellt dann nur eine erste Näherung zu dieser Zahl.
|
|
|
|