|
|
flasche Werte von Modulo in if-Abfrage |
|
MaschbauStudent123 |
Gast
|
 |
Beiträge: ---
|
 |
|
 |
Anmeldedatum: ---
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 01.08.2013, 14:33
Titel: flasche Werte von Modulo in if-Abfrage
|
 |
|
 |
|
Hallo liebe go MATLAB Forenmitglieder,
ich schreibe gerade eine Projektarbeit und muss dafür ein MATLAB-Programm schreiben. Ich hab in 2 ineinander verschachtelten for-schleifen eine if-Abfrage, die mir völlig unverständliche Werte zurückgibt.
die if-Abfrage sieht so aus:
wobei die laufvariable j für die innere und i für die äußere for-Schleife ist.
Eigentlich wollte ich abfragen, ob der modulo der beiden Werte = 0 ist, aber das ist anscheinend nicht möglich, da der tagens des Winkels von MATLAB gerundet wird und daher von Modulo nie 0 zurückgegeben wird, sondern zumindest sehr kleine Werte (Der Winkel wird von MATLAB zu 51,3402 Grad berechnet und der tangens (90-51,3402 Grad) ist laut Taschenrechner 0,7999..., MATLAB rundet das auf 0,8 auf). Wenn ich = 0 zur Bedingung mache, gibt die if-Abfrage niemals 1 zurück, sondern immer nur 0.
Mit dem Debug-Modus habe ich herausgefunden, dass die if-Abfrage nur true zurückgibt, wenn Modulo folgendermaßen berechnet wird:
mod ( ((2 - 0,4) / 0,8) , 2 )
mod ( ((4 - 2,4) / 0,8) , 2 )
mod ( ((10 - 8,4) / 0,8) , 2 ) .
In diesen Fällen sagt mir MATLAB, dass mod 0 ist, also die o.g. Bedinung erfüllt. Das ganze kann man ja auch händig nachvollziehen. allerdings erfüllen eine ganze Reihe von Rechnungen, die, wenn man sie händig ausrechnet, diese Bedingung auch erfüllen würden, dass aber laut MATLAB nicht tun.
Z. B. stößt das Programm irgendwann auf die folgende Berechnung
mod ( ((6-4,4) / 0,8) , 2)
und gibt 2 als Ergebnis wieder. Allerdings ist ja 6-4,4=1,6. Und 1,6/0,8=2. Und mod (2,2) sollte doch eigentlich 0 sein, und nicht 2. Dass diese vom Programm gemacht wird, weiß ich, da ich schon mehrmals überprüft habe, wie die if-Abfrage zustande kommt.
Wenn ich zum Test die Rechnung so in das Command Window eingebe, kriege ich auch 2 zurück. Wenn ich allerdings mod(2,2) berechnen lasse, gibt mir MATLAB 0 zurück.
Ich bin total verwirrt. Weiß jmd von euch vielleicht, warum das so ist?
Vielen Dank schonmal im Voraus. Ich hoffe, ich war verständlich :(
|
|
|
|
|
Thomas84 |

Forum-Meister
|
 |
Beiträge: 546
|
 |
|
 |
Anmeldedatum: 10.02.10
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 01.08.2013, 14:43
Titel:
|
 |
Matlab arbeitet intern mit der Binärdarstellung der Zahlen. Bei der Umwandlung entstehen Rundungsfehler. Daher ist 6-4.4 laut Matlab auch kleiner als 1.6.
Du musst die Abfrage so umschreiben, das sie robust gegenüber diesen numerischen Fehlern ist.
viele Grüße
Thomas
|
|
|
BlackDread |

Forum-Century
|
 |
Beiträge: 212
|
 |
|
 |
Anmeldedatum: 11.05.11
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: 2015a
|
 |
|
|
 |
|
Verfasst am: 01.08.2013, 15:00
Titel:
|
 |
Von mir noch als kleine Anregung
bei Matlab ergibt zwar (6-4.4)==1.6 ein false aber (60-44)==16 ein true, vielleicht kannst du es ja so umgehen?
|
|
|
MaschbauStudent123 |
Gast
|
 |
Beiträge: ---
|
 |
|
 |
Anmeldedatum: ---
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 01.08.2013, 15:21
Titel:
|
 |
Danke für die Anregung!
Hatte nicht erwartet, dass bei einem solch komfortablen Programm wie MATLAB sowas noch abgefangen werden muss.
Der Tipp mit den dezimalstellen ist schonmal sehr gut!
allerdings weiß ich nicht, auf wieviele Nachkommastellen er immer rundet. Bei dem Winkel z. B. sind es 4. Ist das Standard?
|
|
|
Jan S |

Moderator
|
 |
Beiträge: 11.057
|
 |
|
 |
Anmeldedatum: 08.07.10
|
 |
|
 |
Wohnort: Heidelberg
|
 |
|
 |
Version: 2009a, 2016b
|
 |
|
|
 |
|
Verfasst am: 01.08.2013, 18:33
Titel:
|
 |
|
 |
|
Hallo MaschbauStudent123,
Zitat: |
Hatte nicht erwartet, dass bei einem solch komfortablen Programm wie MATLAB sowas noch abgefangen werden muss. |
Das ist amüsant. Das Problem liegt nicht bei Matlab, sondern es gibt generell keine Möglichkeit die begrenzte Precision bei der Verwendung mit Doubles zu umgehen. Die einzige mathematisch sinnvolle Lösung wäre die Verwendung unendlicher vieler Dezimal-Stellen beim Speichern der Zahlen. Das würde aber auch eben mal unendlich viel Speicher benötigen.
Deshalb treten die Effekte der IEEE754-Arithmetik in jeder numerischen Software auf und es sind die Benutzer, die dies abfangen müssen. Und das ist je nach Fall vollkommen unterschiedlich. Mal müssen absolute Abweichungen verglichen werden, mal relative, mal beide.
Der Effekt tritt sogar in der physiklaischen Welt auf, bei der man z.B. auch die Position eines Elektrons und seinen Impuls beliebig genau angeben kann, weil die Quantenmechanik das verhindert. Das Messen der Entfernung zwischen Hamburg und München wird auch nicht auf den Millimeter genau machbar sein. Und wenn man zwei solche Messungen vergleicht, braucht man sich nicht über Ungenauigkeiten zu wundern. Und ein Vergleich mit "==" wird mit Gewissheit scheitern.
Zitat: |
allerdings weiß ich nicht, auf wieviele Nachkommastellen er immer rundet. Bei dem Winkel z. B. sind es 4. Ist das Standard? |
Wie kommst Du auf 4 Nachkommastellen?
Es gibt einen wichtigen Unterschied zwischen der Anzahl der Stellen, die bei Doubles etwa 16 ist, und der Anzahl der angezeigten Stellen, die von gewünschten Format abhängt:
Die Anzeige im Command Window bedeutet also nichts über die zur Berechnung verwendete Genauigkeit.
Das ist übrigens die meist häufig gestellteste Frage. Das Lesen des FAQ ist eine gute Idee, da man dann von den Fehlern anderer profitieren kann, ohne sie erst selbst implementieren zu müssen:
http://matlab.wikia.com/wiki/FAQ
Gruß, 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 - 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.
|
|