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

Wie arbeitet Matlab?, Rundungsfehler

 

Gigastorm
Forum-Anfänger

Forum-Anfänger


Beiträge: 14
Anmeldedatum: 07.10.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.10.2015, 15:26     Titel: Wie arbeitet Matlab?, Rundungsfehler
  Antworten mit Zitat      
Hallo,
Gebe ich in Matlab den code
Code:

%% Ausloeschung
display('Ausloeschung')
a = (1-3*(4/3-1))*1e+16
 

Berechnet Matlab a=2.2204.
Wie kommt Matlab auf genau den Wert?
Für die Darstellung einer Zahl hat Matlab nur eine feste endliche Anzahl von Stellen zur Verfügung.
4/3=1.33333...3
1.333....3-1=0.333....3
Durch die Multiplikation mit 3 wird doch dann die 9 an der letzten Stelle auf 0 gerundet und es müsste 1,00.....0 entstehen?
Wie kommt Matlab also genau auf diese zahl?
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.492
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 17.10.2015, 15:51     Titel:
  Antworten mit Zitat      
Hallo,

der Unterschied ist: du denkst dezimal, MATLAB denkt binär.
2.204e-16 entspricht 2^(-52). Man kann es so interpretieren, dass dies das Bit der Abweichung ist.
https://en.wikipedia.org/wiki/Double_precision

Dasselbe Ergebnis dürftest du übrigens auch in anderen Sprachen bekommen, wenn mit Doubles gerechnet wird.

Grüße,
Harald
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: 17.10.2015, 16:57     Titel:
  Antworten mit Zitat      
Hallo,
Danke für die Antwort.
1)
Ich muss das "Phänomen", dass hier nicht 0 rauskommt nämlich in einer Aufgabe argumentieren können. Reicht diese Erklärung?:

In Matlab steht für die Darstellung einer Zahl nur eine fixe Anzahl von Stellen zur Verfügung. Insgesamt in einem 64-Bit system gibt es nur 52 Bit(Stellen) für die Mantisse.
Jede weitere Operation in Matlab gibt anstelle der exakten Number die nächstgelegene Maschienenzahl, wobei die Genauigkeit mit:
a \circ^r b = (a \circ b) (1+ \epsilon) mit |\epsilon|<eps
wobei \circ^r die Verknüpfung in Matlab darstellt
2.204e-16=2.204*10^(-16),entspricht 2^(-52), dies kann als Bit der Abweichung in der Mantisse interpretiert werden.
Aber der engültige Fehler ist ja viel größer durch die Multiplikation mit 10^(-16)??

2)
Wie ist das bei:
Code:
%% sine
display('sine')
s = sqrt(1e-16 + 1) - 1
%% Runden von 0.1
display('Rundungsfehler von 0.1')
b = 0;
for i = 1:10
    b = b + 0.1;b
end
b == 1

Matlab liefert s=0 und b\not= 1.
1e-16 kann ja Matlab noch darstellen. Aber wieso wird 1e-16 +1 dann zu 1?
Für die For-Schleife liefert Matlab auch die zu erwartenden Ergebnisse:
b =
0.1000
b =
0.2000
b =
0.3000
b =
0.4000
b =
0.5000
b =
0.6000
b =
0.7000
b =
0.8000
b =
0.9000
b =
1.0000
Aber wieso entspricht b nicht 1? Matlab muss doch hier nichts runden?
Private Nachricht senden Benutzer-Profile anzeigen
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 17.10.2015, 17:11     Titel:
  Antworten mit Zitat      
weil einige zahlen keine darstellung in binärform haben. 0.1 glaube ich gehört dazu
_________________

richtig Fragen
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: 17.10.2015, 18:07     Titel:
  Antworten mit Zitat      
Hallo,
Ah ich verstehe,0,1 hat eine nicht abbrechende periodische Darstellung im Binärsystem und die muss gerundet werden in Matlab. (0.1)_{10}=(0.0001100110011...)_2=(1.1001100110011..)_2 * 2^4Danke
Und wie ist das mit s=0 im anderen Bsp? Wieso ist 1e-16 + 1=1 ? 1e-16 kann doch noch von Matlab dargestellt werden?

Liebe Grüße
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: 17.10.2015, 18:17     Titel:
  Antworten mit Zitat      
Hallo Gigastorm,

Zitat:
Wieso ist 1e-16 + 1=1?

Matlab verwendet IEEE754 Doubles (siehe den Link von Harald). Wenn für die Mantisse nur 52 Bits zur Verfügung stehen, wird bei 1 + 1e-16 die kleinere Zahl nicht mehr speicherbar. Das gleiche gilt für 1e16 + 1.

Der gleiche Effekt tritt mit Dezimalzahlen auf: Wenn man nur 3 Stellen speichern kann, ist 100 * 1e1 + 1 das gleiche wie 100 * 1e1.

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: 18.10.2015, 08:01     Titel:
  Antworten mit Zitat      
Vielen Dank für die Erklärung.
Wenn ich mir z.B anschaue:
Code:

b = 1e-16 + 1 - 1e-16;
c = 1e-16 - 1e-16 + 1;
b == c

Dann sind das für Matlab zwei verschiedene Nummern. Wieso wenn er sowieso nicht den Spiecherplatz hat um die kleiner Nummer darzustellen bei 1e-16 + 1=1 und 1-1e-16=1?
Liebe Grüße
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

ich verstehe die Frage nicht. Zur Erklärung der unterschiedlichen Ergebnisse:
es wird von links nach rechts gerechnet, also

b = (1e-16 + 1) - 1e-16 = 1 - 1e-16 < 1
c = (1e-16 - 1e-16) + 1 = 1

Bleibt höchstens noch die Frage, warum 1 + 1e-16 nicht von 1 unterschieden werden kann, 1 - 1e-16 aber schon. Das liegt an der Gleitkommadarstellung:

Code:
format hex
1 + 2e-16
1 - 2e-16
format shortg


Grüße,
Harald
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: 18.10.2015, 14:00     Titel:
  Antworten mit Zitat      
Hallo,
Danke für deine Antwort. Entschuldige, ich hatte mich schlecht ausgedrückt. Genau das war die Frage, wieso Matlab nicht zwischen 1 + 1e-16 und 1 unterscheiden kann aber zwischen 1 und 1 - 1e-16 schon.
Ich habe deinen Code mir angesehen. Man sieht ja auch bei der Dezimaldarstellung:
1- 10^{-16}= \frac{10^{16}-1}{10^{16}}=(0.9999999999999999)_{10} und  10^{-16} +1= (1.0000000000000001)_{10}
Die Kapazität (Mantisse, Exponent) reicht doch aus um 10^{-16} abgeschnitten in Binärform darzustellen, dafür nutzt er keine Stellern der Mantisse sondern nur den Exponenten in der Gleitkommadarstellung. (Außer die erste, vor dem Komma die ist aber immer als 1 eingespeichert)

Um 10^{-16} +1 darzustellen benötigt man zu viele Stellen in der Mantisse so, das die Zahl in Binärdarstellung so abgeschnitten wird, dass nur doch die 1.000..00 überbleibt: (1.0000000000000001)_{10}=(1,000000000000000000000000000000000000000000000000000001...)_2

Aber wird bei (0.9999999999999999)_{10}=(0.11111111111......)_2 (viele Einser nach dem Komma aber irgendwan kommt auch immerwieder eine 0 vor) nicht auch gerundet, wodurch (1,0000000....)_2 entsteht?


Liebe Grüße
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

ja, aber aufgrund der unterschiedlichen Exponentialdarstellung sind gleich weit entfernte Zahlen < 1 noch unterscheidbar, > 1 nicht mehr.

Grüße,
Harald
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, 20:49     Titel:
  Antworten mit Zitat      
Wie wird eigentlich festgelegt auf welche Exponentialdarstellung gerechnet wird? Auf die der ersten oder zweiten Ziffer? Oder normalisiert der PC die Zahlen vorher?

Liebe Grüße
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

Wie wird eigentlich festgelegt auf welche Exponentialdarstellung gerechnet wird?

Nach dem bereits mal verlinkten IEEE 754-Standard.

Zitat:
Auf die der ersten oder zweiten Ziffer? Oder normalisiert der PC die Zahlen vorher?

Ich verstehe keine dieser Fragen.

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: 20.10.2015, 09:22     Titel:
  Antworten mit Zitat      
Hallo Gigastorm,

Ich klinke mich aus der Diskussion aus, da sie nur indirekt mit Matlab zu tun hat. Die IEEE754-Definitionen sind umfangreich und kompliziert, werden aber eindeutig an anderer Stelle im Internet umfassen erklärt.

Viel Erfolg, 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 - 2024 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.