|
|
Zahl in Vektor finden schlägt fehl, obwohl Wert vorhanden |
|
Max24 |
Forum-Fortgeschrittener
|
|
Beiträge: 60
|
|
|
|
Anmeldedatum: 29.06.14
|
|
|
|
Wohnort: Deutschland
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 31.03.2017, 08:54
Titel: Zahl in Vektor finden schlägt fehl, obwohl Wert vorhanden
|
|
|
|
|
Moin, ich habe eine Funktion zum Integrieren geschrieben, der ich die untere (time_min) und die obere (time_max) Integrationsgrenze (Zeitintervall) übergebe.
Der Vektor "dataset" soll dann entsprechend zugeschnitten werden, indem der untere und obere Index gefunden wird. Hier stellt "measurement.time" den Zeitvektor dar.
Die Funktion funktioniert wunderbar, allerdings schlägt der Vergleich für einen bestimmten Wert (time_max = 2.97) fehl.
index_end = find(measurement.time == time_max) bleibt ein leerer Wert [].
Wenn ich dasselbe ausführe mit:
index_end = find(measurement.time == 2.97) erhalte ich den gewünschten Index, obwohl dies time_max entspricht.
Anscheinend stellen time_max und 2.97 händisch eingetippt nicht denselben numerischen Wert dar. Handelt es sich hier um einen Bug, oder kommt so etwas öfter vor und man muss aufpassen mit einem Zahlenvergleich nach Werten in einem Vektor zu suchen?
Wenn ich folgendes Casting vornehme, tritt der Fehler nicht mehr auf:
time_max = str2num(num2str(time_max));
Grüße,
Max
|
|
|
|
|
Harald |
Forum-Meister
|
|
Beiträge: 24.492
|
|
|
|
Anmeldedatum: 26.03.09
|
|
|
|
Wohnort: Nähe München
|
|
|
|
Version: ab 2017b
|
|
|
|
|
|
Verfasst am: 31.03.2017, 21:26
Titel:
|
|
Hallo,
vermutlich treten irgendwo in deiner Berechnung minimale Rundungsfehler auf. Besser als ein Test auf Gleichheit ist grundsätzlich ein Test auf geringfügige Abweichung:
abs(x-y) < tol statt x == y
Ein Beispiel:
Grüße,
Harald
|
|
|
Jan S |
Moderator
|
|
Beiträge: 11.057
|
|
|
|
Anmeldedatum: 08.07.10
|
|
|
|
Wohnort: Heidelberg
|
|
|
|
Version: 2009a, 2016b
|
|
|
|
|
|
Verfasst am: 03.04.2017, 14:38
Titel: Re: Zahl in Vektor finden schlägt fehl, obwohl Wert vorhand
|
|
Hallo Max24,
Das hört sich nach dem Klassiker unter den FAQ an:
Das liegt an der begrenzten Anzahl von Stellen im DOUBLE Format. Suche nach "IEEE754" im Netz. Die meisten Dezimal-Zahlen haben keine exakte Darstellung im Binär-Format (un umgekehrt). Deshalb ist 0.1 + 0.1 + 0.1 ~= 0.3 (siehe Haralds Beispiel - wie gesagt: ein tausendfach gefragter Klassiker). Wenn Du also nach 2.97 suchst, geht das wahrscheinlich nur über eine Toleranz:
Das Limit hängt dabei von den Daten ab, es gibt da keine generell "richtige" Wahl.
Das sieht sehr gruselig aus. Ich bin sicher, das lässt sich besser lösen.
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 - 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.
|
|