WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Stufen Plot, Rundungsfehler

 

Gigastorm
Forum-Anfänger

Forum-Anfänger


Beiträge: 14
Anmeldedatum: 07.10.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.10.2015, 17:47     Titel: Stufen Plot, Rundungsfehler
  Antworten mit Zitat      
Wie kommt es durch den unten angegebenen Code zu diesem komischen Plot?
Code:
f = [];
x = [1e-16:1e-17:1e-15];
for i = 1:length(x)
    f(i) = ((1+x(i))-1)/(1+(x(i)-1));
end
plot(x,f)


Per Hand wäre jede f(i)-Koordinate 1,
aber in Matlab ist f(1)=0, f(letze)=1.111..
Meine Frage ist nun wie Matlab auf diesen stufigen Plot kommt? f(2)=\frac{(1+(10^{-16}+10^{-17})-1}{1+((10^{-16} + 10^{-17})-1)}

LG
Private Nachricht senden Benutzer-Profile anzeigen


Epfi
Forum-Meister

Forum-Meister



Beiträge: 1.134
Anmeldedatum: 08.01.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.10.2015, 17:56     Titel:
  Antworten mit Zitat      
Darum?

Code:
f = [];
g = [];
x = [1e-16:1e-17:1e-15];
for i = 1:length(x)
    f(i) = ((1+x(i))-1);
    g(i) = (1+(x(i)-1));
end
plot(x, 1e15*f, x, 1e15*g, x, f./g)
legend('f', 'g', 'f/g')
 


EDIT (20:26): Kommentar aus Code entfernt

Zuletzt bearbeitet von Epfi am 18.10.2015, 19:27, insgesamt einmal bearbeitet
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 18.10.2015, 17:57     Titel:
  Antworten mit Zitat      
Hallo,

schau dir doch Zähler und Nenner getrennt an, dann wird es klarer. Knapp unter 1 ist eben durch die Verwendung von Gleitkommazahlen die Auflösung höher als knapp über 1.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 18.10.2015, 18:00     Titel: Re: Stufen Plot, Rundungsfehler
  Antworten mit Zitat      
Hallo Gigastorm,

Wie in Deinem anderen Thread bereits angesprochen, sind diese Effekte genau wso, wie man sie beim Rechnen mit IEEE754 doubles erwartet. Das liegt also nicht an Matlab, sondern an dem sehr weit verbreiteten Standard zur Darstellung von Gleitkomma-Zahlen.
Insofern ist der Plot nicht "komisch".

Warum der erste Wert 0 ist und nicht 1 sollte nach der Beantwortung Deines anderen Threads klar sein: (1e-16 + 1) - 1 ist 0 und nicht 1e-16.
Genauso lässt sich weiter argumentieren für die anderen Werte. Die Rundungen führen dazu, dass die Werte abgeschnitten werden. Dieser Effekt ist bei der Implementierung numerischer Codes sehr wichtig und es gibt sehr viel Literatur zu diesem Thema. Siehe:

https://de.wikipedia.org/wiki/Gleitkommazahl
http://wiki.selfhtml.org/wiki/Progr.....technik/Rechnerarithmetik
usw.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Gigastorm
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 14
Anmeldedatum: 07.10.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.10.2015, 00:54     Titel:
  Antworten mit Zitat      
Danke für die Antworten. Habe mir die Artikel durchgelesen.
Aber ich sehe noch immer nicht ein,wieso 1+1.1*10^{-16} als 1 interpretiert wird aber 1+1.2*10^{-16} anscheinend nicht. Woran steckt das bei der Runden der Binärzahlen?
Ich versuch gerade zu verstehen wie man auf f(3)=2 kommt:
Ich weiß ich rechne hier in Dezimalcode und die Rechensysteme in Binärcode. Aber ich wüsste nicht wie ich dem besser auf den Grund gehe?
f(3)= \frac{(1+(1.2*10^{-16}))-1}{1+(1.2*10^{-16}-1)}=\frac{(10^{-16}*(10000000000000000+1.2)))-1}{1+(10^{-16} (1.2-10000000000000000)}=\frac{1.000000000000000012-1}{1+(-0.9999999999999988)}
Da die Dezimalzahlen in Binärdarstellung umgewandelt werden, werden die Nachkommestellen schon viel früher abgeschnitten.
Also ist es per Hand gar nicht möglich die Werte die Matlab in den Bsp. ausgibt genau nachzuvollziehen?
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 19.10.2015, 08:49     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
Also ist es per Hand gar nicht möglich die Werte die Matlab in den Bsp. ausgibt genau nachzuvollziehen?

Möglich ist es natürlich. Man muss allerdings ganz genau darauf achten, dass man die Binärdarstellung richtig hinbekommst und dann auch noch die Arithmetik.

Ich kann dir nur empfehlen, dir die Graphen von Zähler und Nenner separat anzusehen. Siehe auch dein anderer Thread.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 19.10.2015, 10:13     Titel:
  Antworten mit Zitat      
Hallo Gigastorm,

Zitat:
... 1+1.1*10^{-16} als 1 interpretiert wird aber 1+1.2*10^{-16} anscheinend nicht

Weil 1.2e-16 offensichtlich eine Binär-Darstellung hat, die nicht mehr außerhalb der des Bereiches liegt, bei dem bei 1.0 die Stellen wegfallen.

Man kann alle Ergebnisse der Double-Arithmetik auch von Hand nachvollziehen. Dazu muss man die Zahlen unbedingt zuerst korrekt ins Binärsystem übertragen, wie es in IEEE754 definiert ist. Danach sind die Ergebnisse eindeutig definiert und logisch. Die Arithmetik wird nicht von Matlab durchgeführt, sondern es werden die Floating-Point-Einheiten (bzw SSE) des Prozessors benutzt.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2025 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.