Maschinengenauigkeit < Numerik < Hochschule < Mathe < Vorhilfe
|
Status: |
(Frage) beantwortet | Datum: | 13:50 Fr 11.04.2014 | Autor: | Paivren |
Hallo,
es gibt leider keinen passenden Unterpunkt für dieses Thema;
ich wollte es aber trotzdem hier posten, und nicht im Informatikbereich, da dort vielleicht anders an das Thema herangetreten wird.
http://matheplanet.com/default3.html?call=viewtopic.php?topic=61641&ref=http%3A%2F%2Fwww.google.de%2Furl%3Fsa%3Dt%26rct%3Dj%26q%3D%26esrc%3Ds%26source%3Dweb%26cd%3D2%26ved%3D0CDkQFjAB
Hier wird ein kleiner Code zum Bestimmen der Maschinengenauigkeit präsentiert (im Post des Antwortenden).
e=1;
while (e+1>1){
e=e/2;
}
e=2*e;
Angenommen, die Maschinengenauigkeit wäre [mm] 2^{-52} [/mm] (also Standard).
Irgendwann ist [mm] e=2^{-51}. [/mm] Die Bedingung ist erfüllt, e wird halbiert auf [mm] 2^{-52}. [/mm] Die Bedingung ist wieder erfüllt.
Dann wird e nochmal halbiert auf [mm] e^{-53}. [/mm] Aber diese Zahl kann der Computer nicht mehr darstellen und rundet auf, zu [mm] e^{-52}. [/mm] --> Endlosschleife.
Die Rundung haben wir so definiert:
f(n)= [mm] \pm \begin{cases} (1+m_{1}2^{-1}+...+m_{52}2^{-52})2^{k}, & \mbox{für } m_{53}=0 \\ (1+m_{1}2^{-1}+...+m_{52}2^{-52} +2^{-52})2^{k}, & \mbox{für } m_{53}= 1 \end{cases}
[/mm]
Irgendwie versteh ich das maschineninterne Prinzip der Rundung wohl nicht so richtig.
Wenn e zu [mm] 2^{-54} [/mm] werden würde, so würde es auf 0 gerundet werden und die Bedingung wäre nicht mehr erfüllt.
Aber dazu kommt es ja scheinbar nicht, s.o.
jemand nen Tipp?
Gruß
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 16:41 Fr 11.04.2014 | Autor: | DieAcht |
Hier stand nicht viel richtiges.
DieAcht
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 20:20 Fr 11.04.2014 | Autor: | Paivren |
Hallo,
es geht sich nicht um den Code, sondern um die Frage, warum das keine Endlosschleife wird.
Nochmal meine Frage lesen, bitte (nicht böse gemeint^^).
|
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 12:37 Sa 12.04.2014 | Autor: | leduart |
Hallo
ich denke es liegt an den e+1>1 und nicht [mm] \ge1
[/mm]
Gru00 leduart
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 12:38 So 13.04.2014 | Autor: | Paivren |
Hey,
also nochmal meine Frage:
e=1;
while (e+1>1){
e=e/2;
}
e=2*e;
Das gibt mir den richtigen Wert von [mm] e=2^{-52}.
[/mm]
Aber WARUM tut es das?
Wenn [mm] e=2^{-52} [/mm] ist, dann ist die Bedingung erfüllt.
e=e/2 --> [mm] e=2^{-53}. [/mm] Der Computer rundet nun wieder auf [mm] 2^{-52}. [/mm] Die Bedingung ist wieder erfüllt.
--> Endlosschleife!
Erst wenn [mm] e=2^{-54} [/mm] würde es auf 0 gerundet werden und 1+e>1 wäre nicht mehr erfüllt.
Aber dazu kommt es doch nicht!
|
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 14:46 So 13.04.2014 | Autor: | DieAcht |
Hallo Paivren,
Vielleicht nochmal die komplette Definition zum Runden.
Zu einem gegebenen Gleitpunktzahlsystem [mm] F(b,t,e_{\text{min}},e_{\text{max}}) [/mm] mit gerader
Basis $b$ ist die Abbildung
[mm] rd:\{x\in\IR:x_{\text{min}}\le|x|\le x_{\text{max}}\}\to\IR
[/mm]
durch
[mm] rd(x)=\begin{cases} \sigma*(\sum_{k=1}^{t}a_k*b^{-k})b^{e}, & \mbox{falls } a_{t+1}\le\frac{1}{2}b-1 \\ \sigma*(\sum_{k=1}^{t}a_k*b^{-k}+b^{-t})b^{e}, & \mbox{falls } a_{t+1}\ge\frac{1}{2}b \end{cases}
[/mm]
für
[mm] x=\sigma*(\sum_{k=1}^{\infty}a_k*b^{-k})b^{e}
[/mm]
erklärt.
Dabei heißt $rd(x)$ der auf $t$ Stellen gerundeter Wert von $x$.
Bei dir ist die Basis 2, also sollte für
[mm] $a_{t+1}\le [/mm] 0$
abgerundet und analog für
[mm] $a_{t+1}\ge [/mm] 1$
aufgerundet werden.
Ich würde die Aufgabe wie folgt lösen. Es gilt:
[mm] eps:=\frac{1}{2}b^{-t+1}.
[/mm]
Wir nehmen die Dualbasis und erhalten
[mm] eps:=\frac{1}{2}2^{-t+1}=2^{-t}.
[/mm]
Wir gehen im Programm die Mantissenlänge durch und beachten
die vorgegebene Voraussetzung
$1+eps>1$.
1: | function e=eps()
| 2: | t=1;
| 3: | while(1+2^(-t)>1)
| 4: | e=2^(-t);
| 5: | t=t+1;
| 6: | end
|
Das Ergebnis wird sein
[mm] $\approx [/mm] 2.220446049250313e-16$
und dabei kannst du dir am Ende mit
$t=t-1$
die Mantissenlänge, die 52 ist, ausgeben lassen.
Wir erhalten beide das gleiche Ergebnis, aber mein Vorgang
basiert eigentlich nur auf die vorgegebene Definition.
Jetzt beachte die letzten Schritt genauer:
e =
1.776356839400251e-15
1+2^(-t) =
1.000000000000001e+00
e =
8.881784197001252e-16
1+2^(-t) =
1.000000000000000e+00
e =
4.440892098500626e-16
1+2^(-t) =
1.000000000000000e+00
e =
2.220446049250313e-16
1+2^(-t) =
1
Jetzt gilt:
[mm] $1+eps=1+2^{-t}=1\not>1$.
[/mm]
Alles klar?
Gruß
DieAcht
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 15:40 So 13.04.2014 | Autor: | Paivren |
Hallo, danke für die ausführliche Antwort!
Leider versteh ich das ganze immer noch nicht so ganz.
Da Deine Lösung und Definition so ähnlich ist, wie meine, möchte ich Dich darum bitte, das anhand meiner Notationen durchzugehen, weil es sonst ziemlich verwirrend für mich wird:
Die Rundung ist ja fast das selbe, nur das ich gleich im Dualsystem bin, oder?
[mm] rd(x)=\pm \begin{cases} (1+m_{1}2^{-1}+...+m_{52}2^{-52})2^{k}, & \mbox{für } m_{53}=0 \\ (1+m_{1}2^{-1}+...+m_{52}2^{-52} +2^{-52})2^{k}, & \mbox{für } m_{53}= 1 \end{cases}
[/mm]
Das Programm ist sogar identisch (ich sehe jetzt erst, dass ich mich oben vertan habe, entschuldige bitte!)
1: function e=eps()
2: t=1;
3: while(1+2^(-t)>1)
4: e=2^(-t);
5: t=t+1;
6: end
Aber jetzt (gehen wir mal von der Darstellung mit der 2 als Basis aus):
Irgendwann ist t=52.
Abfrage: [mm] 1+2^{-52}>1? [/mm] Ja!
[mm] e=2^{-52}.
[/mm]
t=53
Abfrage: [mm] 1+2^{-53}>1? [/mm] JA!
Denn [mm] 2^{-53} [/mm] wird gerundet auf [mm] 2^{-52} [/mm] (siehe Rundungsdefinition oben).
Dann wird gesetzt: [mm] e=2^{-53}. [/mm] Gerundet auf [mm] 2^{-52}.
[/mm]
Dann: t=54.
Abfrage: [mm] 1+2^{-54}>1? [/mm] NEIN, denn [mm] 2^{-54} [/mm] wird auf Null gerundet.
Die Schleife wird abgebrochen.
Tatsächlich... es ist keine Endlosschleife.
Wow, mir ist das erst jetzt beim Schreiben klar geworden :D
Jetzt muss ich den Exponenten aber wieder um 1 erhöhen, da einmal bereits aufgerundet wurde.
Also [mm] 2^{-52} [/mm] ist die Genauigkeit.
So richtig?
Ich danke Dir schonmal!
|
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 19:16 So 13.04.2014 | Autor: | DieAcht |
Hallo Paivren,
> Hallo, danke für die ausführliche Antwort!
>
> Leider versteh ich das ganze immer noch nicht so ganz.
> Da Deine Lösung und Definition so ähnlich ist, wie
> meine, möchte ich Dich darum bitte, das anhand meiner
> Notationen durchzugehen, weil es sonst ziemlich verwirrend
> für mich wird:
>
> Die Rundung ist ja fast das selbe, nur das ich gleich im
> Dualsystem bin, oder?
Ja. Ich habe es nur mal Allgemeiner geschrieben, damit du
das mit der Rundung besser verstehst.
[mm] $rd(x)=\begin{cases} \sigma\cdot{}(\sum_{k=1}^{t}a_k\cdot{}b^{-k})b^{e}, & \mbox{falls } a_{t+1}\le\frac{1}{2}b-1 \\ \sigma\cdot{}(\sum_{k=1}^{t}a_k\cdot{}b^{-k}+b^{-t})b^{e}, & \mbox{falls } a_{t+1}\ge\frac{1}{2}b \end{cases} [/mm] $
Wenn wir zum Beispiel als Basis die 10 nehmen, dann steht
dort, dass wir für
[mm] a_{t+1}\le\frac{1}{2}*10-1=4
[/mm]
abruden bzw. für
[mm] a_{t+1}\ge\frac{1}{2}*10=5
[/mm]
aufrunden. Das kennst du sicher.
Da wir genau auf $t$ Stellen runden ist [mm] $a_{t+1}$ [/mm] die erste
Nachkommastelle. Dabei ist übrigens [mm] \sigma\in\{-1,1\} [/mm] oder von
mir aus [mm] \sigma\in\{+,-\} [/mm] nur das Vorzeichen.
> [mm]rd(x)=\pm \begin{cases} (1+m_{1}2^{-1}+...+m_{52}2^{-52})2^{k}, & \mbox{für } m_{53}=0 \\ (1+m_{1}2^{-1}+...+m_{52}2^{-52} +2^{-52})2^{k}, & \mbox{für } m_{53}= 1 \end{cases}[/mm]
>
> Das Programm ist sogar identisch (ich sehe jetzt erst, dass
> ich mich oben vertan habe, entschuldige bitte!)
>
> 1: function e=eps()
> 2: t=1;
> 3: while(1+2^(-t)>1)
> 4: e=2^(-t);
> 5: t=t+1;
> 6: end
>
> Aber jetzt (gehen wir mal von der Darstellung mit der 2 als
> Basis aus):
>
> Irgendwann ist t=52.
> Abfrage: [mm]1+2^{-52}>1?[/mm] Ja!
> [mm]e=2^{-52}.[/mm]
> t=53
> Abfrage: [mm]1+2^{-53}>1?[/mm] JA!
> Denn [mm]2^{-53}[/mm] wird gerundet auf [mm]2^{-52}[/mm] (siehe
> Rundungsdefinition oben).
> Dann wird gesetzt: [mm]e=2^{-53}.[/mm] Gerundet auf [mm]2^{-52}.[/mm]
> Dann: t=54.
> Abfrage: [mm]1+2^{-54}>1?[/mm] NEIN, denn [mm]2^{-54}[/mm] wird auf Null
> gerundet.
> Die Schleife wird abgebrochen.
>
> Tatsächlich... es ist keine Endlosschleife.
> Wow, mir ist das erst jetzt beim Schreiben klar geworden
> :D
Ja.
> Jetzt muss ich den Exponenten aber wieder um 1 erhöhen,
> da einmal bereits aufgerundet wurde.
> Also [mm]2^{-52}[/mm] ist die Genauigkeit.
Nein, denn das Programm setzt am Ende nicht noch einmal $eps$.
Das was aber dennoch um Eins erhöht wird ist die Mantissen-
länge $t$. Falls du diese zusätzlich ausgeben willst, dann
musst du natürlich am Ende (im Code) $t=t-1$ setzen.
> So richtig?
> Ich danke Dir schonmal!
Gruß
DieAcht
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 21:43 So 13.04.2014 | Autor: | Paivren |
Vielen Dank für Deine Hilfe!
Gruß
Paivren
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 13:13 Sa 12.04.2014 | Autor: | Diophant |
Hallo,
> es gibt leider keinen passenden Unterpunkt für dieses
> Thema;
> ich wollte es aber trotzdem hier posten, und nicht im
> Informatikbereich, da dort vielleicht anders an das Thema
> herangetreten wird.
warum sollte es das? Wie die Antwort ausfällt, hängt doch allein von deiner Frage und den Kenntnissen der Antwortenden ab, da spielt es keine Rolle, wo ein Thread eingeordnet ist.
Ich habe daher deinen Thread nach Informatik verschoben, da dort inhaltlich hingehört (und das ist hier bei uns das Kriterium für die Einordnung).
Gruß, Diophant
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 15:19 Sa 12.04.2014 | Autor: | DieAcht |
Hallo,
Dieses Thema ist in der Regel das erste Thema in der Numerik
Vorlesung. Normalerweise berechnet man dann auch [mm] x_{\text{min}} [/mm] und [mm] x_{\text{max}}.
[/mm]
Ich habe erst heute Abend Zeit mir meine Unterlagen dazu an-
zugucken, aber ich kann mich gut erinnern, dass die Aufgabe
anders zu lösen war. Soweit ich mich erinnere musste man die
Mantissenlänge vergrößern bis die Voraussetzung nicht mehr
gegeben ist. Der Witz an der Sache war, dass das Ergebnis
gleich war und soweit ich mich erinnere liegt es daran, dass
es das normalisierte- und denormalisierte Gleitpunktzahl-
system gibt. Das musste man dann auch beachten bei der Be-
rechnung von [mm] x_{\text{min}} [/mm] und [mm] x_{\text{max}}.
[/mm]
Gruß
DieAcht
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 19:58 Sa 12.04.2014 | Autor: | Diophant |
Hallo DieAcht,
danke für deine Anmerkungen. Ich habe den Thread daraufhin wieder zurück ins Numerik-Forum verschoben. Sorry an den Themenstarter für meinen Denkfehler.
Gruß, Diophant
|
|
|
|