Verfasst am: 12.03.2021, 12:24
Titel: zwei if Schleifen nur eine funktioniert
Moin zusammen,
irgendwie will meine if Bedingung nicht so wie ich will. Es wird garantiert ein total einfacher Fehler sein. Ich finde ihn nur nicht.
Ich habe jeweils ein Field und ein DropDown Menü mit denen ich eine Start- und eine Stoppfrequenz berechne. Meine Startfrequenz soll nicht höher als 5kHz gehen und die Stoppfrequenz nicht niedriger als 5µHz.
Wenn ich in das Feld für die Startfrequenz 5kHz eingebe ist alles in Ordnung. Erst wenn ich einen höheren Wert wähle wird der Wert mit 5kHz überschrieben.
Das gleiche soll bei der Stoppfrequenz auch passieren. Da bekomme ich aber auch wenn ich 5µHz eingebe die msgbox.
%Warnung, wenn die Startfrequenz größer ist als 5kHz
if app.StartFrequenz > 5e3
msgbox('Startfrequenz zu groß', '','warn')
app.StartFrqFDS_Field.Value = 5;
app.StartFrqFDS_DropDown.Value = 'kHz';
StartFrqFaktor = app.Kilo;
end
app.StartFrequenz = app.StartFrqFDS_Field.Value * StartFrqFaktor;
%Warnung, wenn die Stopfrquenz kleiner ist als 5µHz
if app.StopFrequenz < 5e-6 msgbox('Stopfrequenz zu klein', '','warn')
app.StopFrqFDS_Field.Value = 5;
app.StopFrqFDS_DropDown.Value = 'µHz';
StopFrqFaktor = app.mikro;
end
app.StopFrequenz = app.StopFrqFDS_Field.Value * StopFrqFaktor;
Du möchtest deine Stopfrequenz doch nach unten auf 5µHz begrenzen. Dies scheint es doch zu tun?
Ansonsten kann von meiner Seite des Bildschirms aus nicht nachvollzogen werden, was VOR der Prüfung der stopFrq. in dieser gespeichert ist. Ebenfalls nicht, was in den beiden Werten steht, aus der sie berechnet wird
Code:
%Stop Frequenz berechnen
ifstrcmpi(app.StopFrqFDS_DropDown.Value,'µHz')
StopFrqFaktor = app.mikro; %% <-- WAS steht in app.mikro? elseifstrcmpi(app.StopFrqFDS_DropDown.Value,'mHz')
StopFrqFaktor = app.milli;
elseifstrcmpi(app.StopFrqFDS_DropDown.Value,'Hz')
StopFrqFaktor = 1;
elseifstrcmpi(app.StopFrqFDS_DropDown.Value,'kHz')
StopFrqFaktor = app.Kilo;
end
app.StopFrequenz = app.StopFrqFDS_Field.Value * StopFrqFaktor; %% <-- WAS steht in app.StopFrqFDS_Field.Value?
%Warnung, wenn die Stopfrquenz kleiner ist als 5µHz
%% Welchen Wert hat die StopFrq. VOR dieser Zeile? msgbox('Stopfrequenz zu klein', '','warn')
app.StopFrqFDS_Field.Value = 5;
app.StopFrqFDS_DropDown.Value = 'µHz';
StopFrqFaktor = app.mikro;
end
app.StopFrequenz = app.StopFrqFDS_Field.Value * StopFrqFaktor;
Du möchtest deine Stopfrequenz doch nach unten auf 5µHz begrenzen. Dies scheint es doch zu tun?
Ja das tut es. Wenn ich 4Hz eintrage wird der Wert auf 5µHz geändert und die msgbox erscheint. Das passiert abetr auch wenn ich 5µHz eintrage. Die erscheint wenn ich in der oberen Begrenzung 5kHz eintrage nicht.
@Jan, danke das macht es auf jeden Fall kompakter.
Wie schon geschrieben. Ich habe mit den Debugger jede Zeile angeguckt. In meiner app.StopFrequenz steht 5.00000e-6 drin aber trotzdem wird in diese if Bedingung gesprungen. Wenn ich 6µHz als untere Grenze nehme gibt es das Problem nicht.
Also ich hab mal alles andere aus meinem Programm rausgeschmissen und nur noch die Begrenzung für die untere Frequenz drin gelassen. Das Problem habe ich nur wenn ich 5 als Grenzfrequenz festlege. Bei 4 oder 6 gibt es keine Probleme. Ich bin mit dem Debugger mehrmals alle Zeilen durchgegangen. Ich hab auch mal ein Bild angehängt bei dem man den Inhalt von "StopErg" sehen kann. Vielleicht hat ja noch irgendjemand eine Idee woran das liegen könnte?
if app.StopErg.Value < 5e-6 msgbox('Stopfrequenz zu klein', '','warn')
app.StopF.Value = 5;
app.StopDD.Value = 'µHz';
app.StopErg.Value = 5e-6;
end end end
ich hatte hier schon mitgelesen, verstehe aber beim letzten Beitrag das erste Mal, was eigentlich die Frage ist. Wenn die Frage von vorneherein so klar gestellt gewesen wäre, hätte man sie auch im ersten Versuch beantworten können.
Das Problem sind numerische Berechnungen. Computer arbeiten im Binärsystem, und dort haben Zahlen wie 1e-6 keine Repräsentation mit einer endlichen Stellenanzahl.
Du kannst dir das vorstellen wie 1/3 im Binärsystem: 1/3 = 0.333333333, also 3 * 1/3 = 0.999999999. Das blöde ist nun, man kann die Genauigkeit erhöhen wie man will: wenn man noch so viele 3er anfügt, hat man im Ergebnis ebenso viele 9er, aber nie die Zahl 1.
Abhilfe, wenn man 5e-6 genau zulassen will: den Schwellwert minimal kleiner wählen, z.B. 5e-6 - eps(5e-6)
Grüße,
Harald
_________________
1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
das würde ich als "Glückssache" ansehen. Numerische Fehler können ja in beide Richtungen auftreten, sich aufheben, etc.
Um das zu verstehen, müsste man sich wohl ansehen, wie die Zahlen im Binärsystem repräsentiert sind und wie im Binärsystem die Multiplikation durchgeführt wird. Die Ambition habe ich nicht.
In Hexadezimaldarstellung sieht man schön, dass das letzte Bit mal nicht übereinstimmt, mal schon
Code:
format hex
5e-6 ans =
3ed4f8b588e368f1
5*1e-6 ans =
3ed4f8b588e368f0
5e-9 ans =
3e35798ee2308c3a
5*1e-9 ans =
3e35798ee2308c3a
4e-6 ans =
3ed0c6f7a0b5ed8d
4*1e-6 ans =
3ed0c6f7a0b5ed8d
Edit: eine Multiplikation mit 4 ist verhältnismäßig unkritisch, da sich die Mantisse nicht ändert, sondern nur der Exponent - ähnlich einer Verschiebung des Dezimalkommas.
Code:
1e-6 ans =
3eb0c6f7a0b5ed8d
4*1e-6 ans =
3ed0c6f7a0b5ed8d
1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
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
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.