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

Integer Maximalwert überschreitet -> Lösung wie in C?

 

dummy2k
Forum-Anfänger

Forum-Anfänger


Beiträge: 26
Anmeldedatum: 05.09.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.11.2012, 16:59     Titel: Integer Maximalwert überschreitet -> Lösung wie in C?
  Antworten mit Zitat      
Hallo,

ich habe eine Skript, wo der zulässige Integer-Wert überschritten wird. In C wird der überzogene Wert einfach abgezogen. So kann es passieren, dass eine negative Zahl zurückgegeben wird.

In Matlab ist es immer der Maximalwert, ganz gleich wieviel überzogen wurde.

Kann mir vielleicht jemand bitte einen Tipp geben wie man das am besten löst?

Danke! Lg, Dummy2k
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 06.11.2012, 17:03     Titel:
  Antworten mit Zitat      
Hallo,

Integer-Datentypen können nun mal nur einen beschränkten Bereich darstellen.
Wo genau tauchen die Probleme auf?
Welches Verhalten möchtest du an dieser Stelle?

Und natürlich: gibt es einen guten Grund, überhaupt (diese) Integer-Datentypen zu verwenden? Warum nicht Double, oder Integer mit mehr Bits?

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 26
Anmeldedatum: 05.09.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.11.2012, 17:12     Titel:
  Antworten mit Zitat      
Hallo Harald,

danke für deine Antwort. Ich muß eine Matlab-Version von einem C-Skript erstellen. Dabei kommen im C-Skript Integer-Werte vor. Gibt es ein Overflow, so wird in C nicht der Maximal-Wert genommen, sondern der Overflow einfach vom Maximal-Wert substrahiert.

Im Matlab wird aber immer der Maximal-Wert zurückgegeben. Wie löse ich das am besten? Ich könnte in Matlab zwar einen anderen Datentyp nehmen, aber dadurch würden riesige Zahlen entstehen. Darunter würde dann die Laufzeit leiden.

Danke für deine Hilfe! Lg, dummy2k
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 06.11.2012, 17:47     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
Ich muß eine Matlab-Version von einem C-Skript erstellen.

Was ist der Zweck dieser Übung?

Zitat:
Im Matlab wird aber immer der Maximal-Wert zurückgegeben. Wie löse ich das am besten?

Verschiedene Möglichkeiten, z.B.:
- casten auf einen Datentyp mit mehr Bits, Berechnung durchführen, zurückcasten.
- C-Code über die mex-Schnittstelle einbinden

Zitat:
Ich könnte in Matlab zwar einen anderen Datentyp nehmen, aber dadurch würden riesige Zahlen entstehen.

Warum sollten riesige Zahlen entstehen? Man muss ja ohnehin regelmäßig zurückrechnen, damit die Resultate noch stimmen.

Zitat:
Darunter würde dann die Laufzeit leiden.

Sicher, dass die Effekte da signifikant wären?

Weiterhin die Frage: wann tauchen überhaupt Overflows auf? Beispielsweise nur bei Multiplikation, oder bei verschiedensten Operationen?

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 26
Anmeldedatum: 05.09.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.11.2012, 18:09     Titel:
  Antworten mit Zitat      
Hallo Harald,

Harald hat Folgendes geschrieben:
Hallo,

Zitat:
Ich muß eine Matlab-Version von einem C-Skript erstellen.

Was ist der Zweck dieser Übung?


Ich muß das im Rahmen der Uni machen. Ich arbeite zum ersten Mal mit Matlab und C, daher verzeih bitte die Anfängerfragen Smile

Zitat:

Zitat:
Im Matlab wird aber immer der Maximal-Wert zurückgegeben. Wie löse ich das am besten?

Verschiedene Möglichkeiten, z.B.:
- casten auf einen Datentyp mit mehr Bits, Berechnung durchführen, zurückcasten.
- C-Code über die mex-Schnittstelle einbinden


Ich hab zuerst die Typecast-Variante benutzt, leider hat das wesentlich die Laufzeit erhöht. Gemessen habe ich es mit dem Profiler. Außerdem würde ja das bedeuten, dass einfach ein anderer Datentyp verwendet wird oder? Weil diese Lösung hätte ich dann quasi schon.

Zitat:

Zitat:
Ich könnte in Matlab zwar einen anderen Datentyp nehmen, aber dadurch würden riesige Zahlen entstehen.

Warum sollten riesige Zahlen entstehen? Man muss ja ohnehin regelmäßig zurückrechnen, damit die Resultate noch stimmen.

Zitat:
Darunter würde dann die Laufzeit leiden.

Sicher, dass die Effekte da signifikant wären?


Da viel mit BitOr, BitShift, Bitand und div. Berechnungen gearbeitet wird, gehe ich davon aus, dass es so ist. Ich hoffe ich verzapf da jetzt kein Unsinn Confused

Zitat:

Weiterhin die Frage: wann tauchen überhaupt Overflows auf? Beispielsweise nur bei Multiplikation, oder bei verschiedensten Operationen?


Meistens bei Bitshift Operationen.

1) Was hälst du davon, wenn ich selbst eine kleine Funktion für den "wrap around" programmiere? z.B. Overflow bei Integer (2147483647) -> einfach den Overflow von 21474836487 substrahieren?

Vielen Dank für deine Mühe!!! Lg, dummy2k
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

Zitat:
Ich muß das im Rahmen der Uni machen. Ich arbeite zum ersten Mal mit Matlab und C, daher verzeih bitte die Anfängerfragen

Kein Problem. Ich frage nur deswegen nach, weil ich keine triviale Antwort auf deine Frage sehe.
Insbesondere wenn es um ein Projekt an der Uni geht: macht der C-Algorithmus etwas sinnvolles, wenn ein Overflow auftritt? Insbesondere falls nicht: ist es überhaupt nötig, dass bei MATLAB da das gleiche herauskommt?

Zitat:
Außerdem würde ja das bedeuten, dass einfach ein anderer Datentyp verwendet wird oder?

Ja, aber nur für die Operationen, wo es auch nötig ist.

Eine Möglichkeit, die ich noch nicht erwähnt habe: Man könnte eine Klasse schreiben, die vom entsprechenden Integer-Datentyp vererbt wird, und die problematischen Operationen passend überladen.

Zitat:
Was hälst du davon, wenn ich selbst eine kleine Funktion für den "wrap around" programmiere? z.B. Overflow bei Integer (2147483647) -> einfach den Overflow von 21474836487 substrahieren?

Ich würde vermuten, dass das nichts bringt, da die Overflow-Informationen ja schon verlorengegangen ist. Es kann allerdings sein, dass ich dich da falsch verstehe. Ich arbeite zugegebenermaßen zu 99,9% mit Doubles :)

Grüße,
Harald
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 - 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.