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

Problem Datengenauigkeit Single/Double etc.

 

SebastianR
Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 17.12.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.12.2010, 17:26     Titel: Problem Datengenauigkeit Single/Double etc.
  Antworten mit Zitat      
Hallo zusammen,
ich bin zwar recht unerfahren in Matlab, aber nicht im allgemeinen Programmieren, dashalb kann ich folgendes Matlab-Verhalten nicht so recht verstehen:

Programmbeispiel

Code:

clear all;
%als double
 menge1 = ( [0 0.0075 0.015 0.0225 0.03 0.072]);
 menge2 = ( [0 0.021 0.042 0.048 0.062 0.07 0.1]+0.030);
 gesamtmenge = union(menge1, menge2);   % Mengen vereinen
 gesamtmenge = unique(gesamtmenge);      % Duplikate entfernen
                                      % PROBLEM: ein Element existiert
                                      % doppelt
 % gesamtmenge = 0   0,00750000000000000   0,0150000000000000   0,0225000000000000   0,0300000000000000   0,0510000000000000   0,0720000000000000   0,0720000000000000   0,0780000000000000   0,0920000000000000   0,100000000000000   0,130000000000000
% daher 2 mal 0,072

 a = gesamtmenge(3)-gesamtmenge(2); % Differenz zw. Elementen
 b = double(a) % a = b wie es sein soll
 
 
%als single
 
 s_menge1 = single( [0 0.0075 0.015 0.0225 0.03 0.072]);
 s_menge2 = single( [0 0.021 0.042 0.048 0.062 0.07 0.1]+0.030);
 s_gesamtmenge = union(s_menge1, s_menge2);
 s_gesamtmenge = unique(s_gesamtmenge); % Es existieren keine Duplikate

 s_a = s_gesamtmenge(3)-s_gesamtmenge(2);
 s_b = double(s_a);
 % PROBLEM: s_a != s_b
 % s_a = 0.0075000
 % s_b = 0.007499999832362

 

Ich brauche letztendlich die Menge ohne Duplikate und die Differenz zwischen den Mengenelementen

Wäre schön wenn mir ein Matlab-Kundiger dies mal erklären könnte, bzw. eine Lösung dazu weiß.

Vielen Dank,
Sebastian

PS: Ist Matlab 7.9.0 R2009b
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.12.2010, 19:06     Titel: Re: Problem Datengenauigkeit Single/Double etc.
  Antworten mit Zitat      
Hallo SebastianR,

Code:

 s_a = s_gesamtmenge(3)-s_gesamtmenge(2);
 s_b = double(s_a);
 % PROBLEM: s_a != s_b
 % s_a = 0.0075000
 % s_b = 0.007499999832362
 

Dass die Umwandlung zwischen DOUBLE und SINGLE zu unterschiedlichen Zahlen führen kann, ist logisch. Wieso ist das ein Problem?

Zitat:
Ich brauche letztendlich die Menge ohne Duplikate und die Differenz zwischen den Mengenelementen

Die Menge ohne Duplikate hast Du ja nach UNIQUE.
Was ist "die Different zwischen den Mengenelementen"?

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
SebastianR
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 17.12.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.12.2010, 19:40     Titel:
  Antworten mit Zitat      
Zitat:
Dass die Umwandlung zwischen DOUBLE und SINGLE zu unterschiedlichen Zahlen führen kann, ist logisch. Wieso ist das ein Problem?

Mein Problem ist, das ich als Ergebnis genau DOUBLE 0,0075 brauche. Ich kann mich nicht errinnern, dass ich bei anderen Programmierssprachen so große bzw. überhaupt Abweichungen zwischen den Werten in unterschiedlichen Datentypen habe (Zumindest bei solch einfachen Zahlen).

Zitat:
Die Menge ohne Duplikate hast Du ja nach UNIQUE.

Eben nicht, in der "gesamtmenge" existiert zwei Mal der Wer 0,072

Zitat:
Was ist "die Different zwischen den Mengenelementen"

Letzendlich brauche ich sogesehen, den Abstand zwischen den einzelnen Elementen, also menge(2) - menge(1), menge(3)-menge(2).....

Gibt es noch Lösungvorschläge für eine exakte Lösung?
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.12.2010, 20:15     Titel:
  Antworten mit Zitat      
Hallo SebastianR,

Zitat:
Mein Problem ist, das ich als Ergebnis genau DOUBLE 0,0075 brauche.

Computer-Prozessoren rechnen im Binärsystem. Deshalb können manche Zahlen nicht "exakt" dargestellt werden, da sie einfach keine endlich repräsentierbare Binärzahl sind. Es gibt zwar Mathematik-Programme, die mit beliebiger Genauigkeit rechnen können, aber auch dann heißt "beliebig" nicht "unendlich genau".

Das Problem betrifft also alle Programmiersprachen -- falls man es überhaupt "Problem" nennen kann. Es ist nämlich in den IEEE 754 eindeutig definiert, wie sich die SINGLE und DOUBLE Zahlen verhalten sollen. Und damit ist das Problem wissenschaftlich gesehen gelöst.
Leider ist das offensichtlich nicht sehr intuitiv und viele Benutzer sind von den Auswirkungen verwirrt.

Zitat:
Zitat:
Die Menge ohne Duplikate hast Du ja nach UNIQUE.

Eben nicht, in der "gesamtmenge" existiert zwei Mal der Wer 0,072

Doch. Nach UNIQUE ist der Vektor eindeutig. Garantiert!
Das 0.072 und 0.071999999999999 nicht identisch sind, ist also kein Problem von Matlab, sondern exatkt gerechnet!

Und natürlich wird bei der Transformation von DOUBLEs zu SINGLEs der Wert von Zahlen geändert. Zwar bleiben 1.0 und 2.0 dabei unverändert, aber 12345678901234567.0 z.B. bestimmt nicht.

Hier findest Du ein paar weitere Erklären:
http://matlab.wikia.com/wiki/FAQ#Wh.....r.29_not_equal_to_zero.3F

Die gewünschte Different kannst Du zum Schluß mit dem DIFF-Befehl berechnen.

Gruß, 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.