|
|
Wie arbeitet Matlab?, Rundungsfehler |
|
Gigastorm |
Forum-Anfänger
|
|
Beiträge: 14
|
|
|
|
Anmeldedatum: 07.10.15
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 17.10.2015, 15:26
Titel: Wie arbeitet Matlab?, Rundungsfehler
|
|
Hallo,
Gebe ich in Matlab den code
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?
|
|
|
|
|
Harald |
Forum-Meister
|
|
Beiträge: 24.492
|
|
|
|
Anmeldedatum: 26.03.09
|
|
|
|
Wohnort: Nähe München
|
|
|
|
Version: ab 2017b
|
|
|
|
|
|
Verfasst am: 17.10.2015, 15:51
Titel:
|
|
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
|
|
|
Gigastorm |
Themenstarter
Forum-Anfänger
|
|
Beiträge: 14
|
|
|
|
Anmeldedatum: 07.10.15
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 17.10.2015, 16:57
Titel:
|
|
|
|
|
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:
mit
wobei 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:
Matlab liefert s=0 und .
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?
|
|
|
Winkow |
Moderator
|
|
Beiträge: 3.842
|
|
|
|
Anmeldedatum: 04.11.11
|
|
|
|
Wohnort: Dresden
|
|
|
|
Version: R2014a 2015a
|
|
|
|
|
|
Verfasst am: 17.10.2015, 17:11
Titel:
|
|
weil einige zahlen keine darstellung in binärform haben. 0.1 glaube ich gehört dazu
_________________
richtig Fragen
|
|
|
Gigastorm |
Themenstarter
Forum-Anfänger
|
|
Beiträge: 14
|
|
|
|
Anmeldedatum: 07.10.15
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 17.10.2015, 18:07
Titel:
|
|
Hallo,
Ah ich verstehe,0,1 hat eine nicht abbrechende periodische Darstellung im Binärsystem und die muss gerundet werden in Matlab. Danke
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
|
|
|
Jan S |
Moderator
|
|
Beiträge: 11.057
|
|
|
|
Anmeldedatum: 08.07.10
|
|
|
|
Wohnort: Heidelberg
|
|
|
|
Version: 2009a, 2016b
|
|
|
|
|
|
Verfasst am: 17.10.2015, 18:17
Titel:
|
|
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
|
|
|
Gigastorm |
Themenstarter
Forum-Anfänger
|
|
Beiträge: 14
|
|
|
|
Anmeldedatum: 07.10.15
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 18.10.2015, 08:01
Titel:
|
|
Vielen Dank für die Erklärung.
Wenn ich mir z.B anschaue:
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
|
|
|
Harald |
Forum-Meister
|
|
Beiträge: 24.492
|
|
|
|
Anmeldedatum: 26.03.09
|
|
|
|
Wohnort: Nähe München
|
|
|
|
Version: ab 2017b
|
|
|
|
|
|
Verfasst am: 18.10.2015, 09:06
Titel:
|
|
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:
Grüße,
Harald
|
|
|
Gigastorm |
Themenstarter
Forum-Anfänger
|
|
Beiträge: 14
|
|
|
|
Anmeldedatum: 07.10.15
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 18.10.2015, 14:00
Titel:
|
|
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:
und
Die Kapazität (Mantisse, Exponent) reicht doch aus um 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 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:
Aber wird bei (viele Einser nach dem Komma aber irgendwan kommt auch immerwieder eine 0 vor) nicht auch gerundet, wodurch entsteht?
Liebe Grüße
|
|
|
Harald |
Forum-Meister
|
|
Beiträge: 24.492
|
|
|
|
Anmeldedatum: 26.03.09
|
|
|
|
Wohnort: Nähe München
|
|
|
|
Version: ab 2017b
|
|
|
|
|
|
Verfasst am: 19.10.2015, 08:33
Titel:
|
|
Hallo,
ja, aber aufgrund der unterschiedlichen Exponentialdarstellung sind gleich weit entfernte Zahlen < 1 noch unterscheidbar, > 1 nicht mehr.
Grüße,
Harald
|
|
|
Gigastorm |
Themenstarter
Forum-Anfänger
|
|
Beiträge: 14
|
|
|
|
Anmeldedatum: 07.10.15
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 19.10.2015, 20:49
Titel:
|
|
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
|
|
|
Harald |
Forum-Meister
|
|
Beiträge: 24.492
|
|
|
|
Anmeldedatum: 26.03.09
|
|
|
|
Wohnort: Nähe München
|
|
|
|
Version: ab 2017b
|
|
|
|
|
|
Verfasst am: 19.10.2015, 21:41
Titel:
|
|
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
|
|
|
Jan S |
Moderator
|
|
Beiträge: 11.057
|
|
|
|
Anmeldedatum: 08.07.10
|
|
|
|
Wohnort: Heidelberg
|
|
|
|
Version: 2009a, 2016b
|
|
|
|
|
|
Verfasst am: 20.10.2015, 09:22
Titel:
|
|
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
|
|
|
|
|
Einstellungen und Berechtigungen
|
|
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
| 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.
|
|