Numerik, Rundung
-
Annahme ich habe nomrlaisierte Gleitpunktzahlen mit fester Basis 10 und Mantissenlänge 1
und möchte berechnen:9*9 = 81
(0.9 *10^1) * (0.9 * 10^1) = (0.81 * 10^2)0.81 hat eine zu lange Mantisse.
Im Skript steht nun dass gerundet wird.
Es wird die erste Stelle betrachtet die nach der Stelle mit Mantissenlänge kommt, also in diesem Beispiel die 1, diese ist kleiner als 5 also wird auf( 0,8 * 10^2) = 80 gerundet
Nur was ich mich frage:
woher kennt der Rechner die 1?
Er hat doch gar nicht genug Stellen zur Verfügung um die STelle mit Mantissenlänge+1 zu speichern?Also dürfte er doch auch nicht runden können?!
-
shisha schrieb:
Nur was ich mich frage:
woher kennt der Rechner die 1?
Er hat doch gar nicht genug Stellen zur Verfügung um die STelle mit Mantissenlänge+1 zu speichern?Es gibt sogenannte Guard digits, die fürs korrekte Runden benutzt werden können.
Allgemein ist das aber nur eine Frage der internen Implementierung, würde ich sagen. Wenn die FPU zwei Zahlen multipliziert, muss das eben so implementiert werden, als würde sie immer korrekt runden. Wie das intern umgesetzt wird, ist Sache der FPU, von außen bekommt man das nicht mit.
(Meinen Beitrag bitte mit Vorsicht genießen, Numerik ist so gar nicht mein Gebiet.)
-
hm, mal angenommen, unser Fahrradtacho kann bis 100 zählen. Der Startkilometerstand ist 98. Der Endkilometerstand ist 02. Woher zum Geier weiß
ich trotzdem irgendwie, wie weit ich gefahren bin?Rundungsfehler bei Gleitkommaoperationen spielen auch vor der Rechnung eine Rolle. Man kann das Rundungsverhalten der FPU im Control-Word-Register (CW)
einstellen. Bei Arithmetischen Operationen gibt es neben der Speichergröße immer auch Statusregister (flags), die bestimmte Informationen enthalten.
Außerdem können andere Register zur Mitarbeit überredet werden.Der Wikipediaartikel über Gleitkommazahlen ist recht lesenswert, mit guten
Verweisen:
http://de.wikipedia.org/wiki/Gleitkommazahl
Brauchbar auch:
http://de.wikipedia.org/wiki/Gleitkommaeinheitund apropos 80...äh 80....hm 80....gleich habichs...80....na..., was war da noch...oooochhh.....
hilf mir doch mal einer!p.s.: was passiert, wenn ich zwei SSE (Xmms) Register mit 128bit-Integerzahlen über den fassbaren Wertebereich hinaus addiere?
-
nachtfeuer schrieb:
hm, mal angenommen, unser Fahrradtacho kann bis 100 zählen. Der Startkilometerstand ist 98. Der Endkilometerstand ist 02. Woher zum Geier weiß
ich trotzdem irgendwie, wie weit ich gefahren bin?Rundungsfehler bei Gleitkommaoperationen spielen auch vor der Rechnung eine Rolle. Man kann das Rundungsverhalten der FPU im Control-Word-Register (CW)
einstellen. Bei Arithmetischen Operationen gibt es neben der Speichergröße immer auch Statusregister (flags), die bestimmte Informationen enthalten.
Außerdem können andere Register zur Mitarbeit überredet werden.Das stimmt zwar, hat aber nichts mit der ursprünglichen Frage zu tun.
Die Frage war: Wie kann man bei floating point operations überhaupt richtig runden, wenn man doch nur mit begrenzt vielen Stellen rechnet?Die Wikipedia-Artikel habe ich nicht verlinkt, weil ich die ziemlich lückenhaft fand. Vor allem steht zur ursprünglichen Frage gar nichts in diesen Artikeln.
-
Christoph schrieb:
Die Frage war: Wie kann man bei floating point operations überhaupt richtig runden, wenn man doch nur mit begrenzt vielen Stellen rechnet?
Die Wikipedia-Artikel habe ich nicht verlinkt, weil ich die ziemlich lückenhaft fand. Vor allem steht zur ursprünglichen Frage gar nichts in diesen Artikeln.
Naja, die Frage von shisha wirkte auf mich eher ungenau, denn wo steht denn, dass der hypothetische Einstellenmantissenrechner wirklich rundet? Die Wikiartikel, vor allem der über Gleitkommazahlen, bietet zumindest Anhaltspunkte und gute Links zur Erweiterung des vorhandenen Wissens. Das obige Beispiel ließe sich übrigens mit einer
"Kommaverschiebung" lösen: (9.0)^2 * 10^0 = 8.1 * 10^1Deinen Antworten entnehme ich spekulativ, dass du gerne etwas genaueres wissen
möchtest? Die beste Antwort trotz oder gerade wegen des komplexen (tieferliegenden) Themas, ist, nicht einfach abzulesen, sondern, zu versuchen, so einen minimal-Gleitkomma-Prozessor(emulator)(oder -Algorithmus für einen hypothischen (?bit)-Rechner) selbst zu programmieren. Um auf eine binäre Darstellungen zu kommen, kann man z.B. 9 durch (2^4) teilen oder 9 auf dem
BCD-Format abbilden.:)(nur Mut)
-
Wenn im Skript steht dass nur die 1. Stelle nach der Mantissenlänge angeguckt wird, dann würde ich das einfach so interpretieren bzw. lösen, dass der hypothetische Gleitkommarechner einfach ein entsprechend breiteres Register für Zwischenergebnisse spendiert bekommt.
Oder ist das explizit verboten?