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

Stellen hinter dem Komma ermitteln

 

der_leo
Forum-Newbie

Forum-Newbie


Beiträge: 6
Anmeldedatum: 08.10.10
Wohnort: Kassel
Version: ---
     Beitrag Verfasst am: 08.10.2010, 16:30     Titel: Stellen hinter dem Komma ermitteln
  Antworten mit Zitat      
Hallo Matlab-Gemeinde,

ich habe ein Problem:
Ich möchte in Matlab die Anzahl der Stellen hinter einem Komma ermitteln, damit ich die Zahl mit der entsprechenden 10ner Potenz multiplizieren kann.

Z.B.:
2.34564 * 10⁵ = 234564;

und ich muss auf irgendeine Weise den Exponenten (hier: 5) ermitteln.

Weiß jemand Rat?

Bin dankbar für jede Hilfe.

Gruß, Leo
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.492
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 08.10.2010, 18:21     Titel:
  Antworten mit Zitat      
Hallo,

Vorschlag:
Code:
x = 2.34564;
xstr = num2str(x, '%32.16g');
stelle = length(xstr) - find(xstr == '.')


Mich würde die Anwendung interessieren. Muss das ganze auf einen Vektor angewendet werden? Wird der Faktor dann für jeden Wert einzeln bestimmt, oder ist der größte oder kleinste Faktor entscheidend?

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
der_leo
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 6
Anmeldedatum: 08.10.10
Wohnort: Kassel
Version: ---
     Beitrag Verfasst am: 08.10.2010, 18:30     Titel:
  Antworten mit Zitat      
Hi,

das ganz muss sowohl auf Matrizen, als auch auf Vektoren angewendet werden.
Und dabei interessiert mich dann der größte notwendige Exponent innerhalb der Matrix / des Vektors.

Vielen Dank für den Lösungsvorschlag.

Gruß, Leo
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.492
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 08.10.2010, 19:25     Titel:
  Antworten mit Zitat      
Hallo,

eine Möglichkeit: Definiere
Code:
function y = findexp(x)
xstr = num2str(x, '%32.16g');
y = length(xstr) - find(xstr == '.');

und dann
Code:
A = [2.34 4.567; 1.4983 1.1];
alle = arrayfun(@findexp, A);
max(alle(:))


Wie effizient das für große Matrizen/Vektoren ist, ist wieder die andere Frage.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
der_leo
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 6
Anmeldedatum: 08.10.10
Wohnort: Kassel
Version: ---
     Beitrag Verfasst am: 08.10.2010, 20:57     Titel:
  Antworten mit Zitat      
Hi,

ich werde einfach mal austesten, ob die Perfomance annehmbar ist.

Vielen Dank nochmal

Gruß, Leo
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: 08.10.2010, 23:57     Titel:
  Antworten mit Zitat      
Hallo Leo,

die oben genannte Methode wird oft funktionieren. Aber nicht immer.
Was erwartest Du für:
x = 1.999999999999999
Soll das als 2.0 behandelt werden?
Wie wäre es mit:
x = 1.000000000000001
Solche Zahlen treten auch bei harmlos aussehenden Funktionen auf:
Code:
x = [0:0.1:10]
x*10 - round(x*10)
 

Also müsstest Du eigentlich zunächst bei einer bestimmten Nachkommastelle runden, bevor Du feststellen kannst, ob bis zu einer (anderen) bestimmten Nachkommastelle gerundet wurde...

Numerisch gesehen in das Zählen von Nullen in der Dezimal-Darstellung einer Floatingpoint-Zahl, die intern binär gespeichert wird, nicht sinnvoll. Beim Umrechnen von binär nach dezimal gibt es Rundungsfehler, die ausgesprochen hartnäckig sind, sich also nicht mal eben weg-runden oder -schneiden lassen.

Woher stammt denn Deine Zahlen?
Kannst Du die binär-Werte benutzen (siehe TYPECAST und DEC2HEX)?

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Seban
Forum-Meister

Forum-Meister


Beiträge: 600
Anmeldedatum: 18.01.12
Wohnort: ---
Version: ab R2014b
     Beitrag Verfasst am: 14.01.2013, 19:39     Titel:
  Antworten mit Zitat      
Hi,

Ich muss prüfen, ob Werte nicht mehr als 3 Nachkommastellen aufweisen. Dazu verwende ich diesen Ansatz von Harald (um eine if-Abfrage ergänzt, um Fehlermeldungen zu unterbinden, falls eine Zahl keine Nachkommastellen hat):

Harald hat Folgendes geschrieben:
Code:
function y = findexp(x)
xstr = num2str(x, '%32.16g');
y = length(xstr) - find(xstr == '.');
if isempty(y)
    y = 0;
end

und dann
Code:
A = [2.34 4.567; 1.4983 1.1];
alle = arrayfun(@findexp, A);
max(alle(:))


Ich stoße allerdings auf ein Problem: Manchmal werden nicht die Nachkommastellen ~= 0 gezählt, sondern auch Nullen. Die Zahlenwerte werden aus einer Excel-Datei eingelesen und dort steht bspw. 8.002. Matlab macht dann daraus (steht so im Variable Editor) 8.002000000000000 und gibt für y 15 aus. Bei einer anderen Zahl im gleichen Vektor im gleichen Funktionsaufruf gibt er korrekterweise 3 aus, obwohl sie im Variable Editor so angezeight wird: 10.058000000000000.

Wie kann ich diesen Rundungsfehlern (?) entgegentreten? So wird das Ergebnis ja verfälscht. Ich tippe auf eps, aber ich habe keine Idee, wie ich dies in diesem Fall einsetzen kann.

Grüße,
Seban
_________________

Richtig fragen
Debugging
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.492
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 14.01.2013, 20:22     Titel:
  Antworten mit Zitat      
Hallo,

Alternative:
Code:
round(1000*x) == 1000*x

oder besser, um Rundungsfehler auszuschließen:
Code:
abs(round(1000*x) - 1000*x) < toleranz


Grüße,
Harald
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: 14.01.2013, 22:27     Titel:
  Antworten mit Zitat      
Hallo Seban,

Bitte hänge eine neue Frage nicht an ein bestehendes Thema an.

Zitat:
Ich muss prüfen, ob Werte nicht mehr als 3 Nachkommastellen aufweisen.

Es gibt hier ein prinzipielles Problem, dass die Zahlen, die intern im Binär-Format gespeichert sind, nicht unbedingt eine exakte Representation im Dezimal-Format hat. Nun bleibt es zu definieren, ob 0.0029999999999999 nun 3 Nachkommastellen hat oder 15. Das ist gar nicht ohne weiteres entscheidbar.

Haralds Vorschlag ist dagegen ordentlich definiert, allerdings ist die Wahl der Toleranz nicht trivial.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Seban
Forum-Meister

Forum-Meister


Beiträge: 600
Anmeldedatum: 18.01.12
Wohnort: ---
Version: ab R2014b
     Beitrag Verfasst am: 14.01.2013, 22:31     Titel:
  Antworten mit Zitat      
Wieder mal vielen Dank, Harald Very Happy

Code:
A = [2.34; 4.567; 1.4983; 1.1];
y = abs(round(1000*A) - 1000*A) < eps;

if sum(y==0) > 0
    % es gibt mind. eine Zahl mit mehr als 3 Nachkommastellen
end



Edit:
Jan S hat Folgendes geschrieben:
Bitte hänge eine neue Frage nicht an ein bestehendes Thema an.

Sorry, dachte es passt hier perfekt rein, da es um das selbe Ausgangsproblem ging & ich Bezug auf einen Lösungsvorschlag genommen hab. Beim nächsten mal mach ich einen neuen Thread auf Smile

Zitat:
Es gibt hier ein prinzipielles Problem, dass die Zahlen, die intern im Binär-Format gespeichert sind, nicht unbedingt eine exakte Representation im Dezimal-Format hat. Nun bleibt es zu definieren, ob 0.0029999999999999 nun 3 Nachkommastellen hat oder 15. Das ist gar nicht ohne weiteres entscheidbar.

Es ist in diesem Fall so, dass die Werte in der Excel-Datei bereits gerundet sind (sofern sie ursprünglich mehr als 3 Nachkommastellen hatten). Dh. aus ursprünglich 0.0029999999999999 wäre bereits vor dem einlesen in Matlab 0.003 geworden. Es geht also "nur" noch darum zu vermeiden, dass durch das Einlesen in Matlab Rundenungsfehler das Ergebnis verfälschen könnten.
(Ich prüfe in Matlab eigentlich nur auf Nachkommastellen, um zu vermeiden, dass jemand sich bei der Eingabe der Werte in Excel vertan hat.)

Zitat:
Haralds Vorschlag ist dagegen ordentlich definiert, allerdings ist die Wahl der Toleranz nicht trivial.

In meinem Fall sollte eps aber ausreichend sein, oder? Wie gesagt geht es ja nur darum Matlabs eigene Probleme beim Runden zu umgehen.

Dir auch vielen Dank für die Antwort.
_________________

Richtig fragen
Debugging
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.