Forum: Mikrocontroller und Digitale Elektronik Überlauf mit Integer


von MAB (Gast)


Lesenswert?

Hallo!

Ich habe ein Problem - hervorgerufen
durch folgende Rechenoperation:

a = 10 * 10.000

a soll den Wert zwischenspeichern.
Da es sich bei a aber um eine Integer handelt
(es sind keine anderen Datentypen vorhanden)
kommt es zu einem Überlauf.

Wie geht man am besten vor,
wenn ich Zahlen > 2^15
in Integer-Variablen speichern soll?

Sprache: NQC

Schöne Grüße
MAB



von antworter (Gast)


Lesenswert?

Hallo,

die Größe des Datentyps "int" hängt von der Architektur ab (16 Bit / 32 
Bit).

Mein Tip: da Du wohl in C programmierst, solltest Du mal ein Blick in 
die relevanten ".h" Dateien werfen.

10 * 10.000 = 100.000 > 2^16

probier mal "long" / "uint32_t" als Datentyp

von MAB (Gast)


Lesenswert?

Ne leider eben nicht C
sondern NQC - Not Quite C
Hier gibt es keinen Datentyp
außer Integer.
16 bit Architektur.

Kann mir jemand helfen?

von Thorsten (Gast)


Lesenswert?

NQC ist die Sprache fuer die Lego Mindstorms Serie, aha!
http://en.wikipedia.org/wiki/NQC

Also wenn's da wirklich keine anderen Datentypen gibt, hilft es nur, 
nach einer der Addition das Carry flag zu untersuchen (ja, nach der 
Addition, Du mussst also selbst ne Multiplikationsroutine bauen ...)
Aber ich hab in dem Tutorial mal nach Carry gesucht und nix gefunden ... 
:-O

Sonst wuerde ich evtl. Exponentialdarstellung vorschlagen: ein int fuer 
die Mantisse und einen fuer den Exponenten. Natuerlich braucht das auch 
eine eigene Multiplikationsroutine ...

Hoert sich nicht prikelnd an, scheint aber so zu sein.

Just my to pence ...

Viel Erfolg!

Thorsten

von MAB (Gast)


Lesenswert?

Danke! Sorry ich dachte NQC ist eine gängige Sprache.
Ich nicht sagen, ob Exponentialdarstellungen unterstützt
werden... noch nicht. Den anderen Vorschlag werde ich mir
auch noch genauer ansehen.

Gruß
MAB

von Axel R. (Gast)


Lesenswert?

> Ich nicht sagen, ob Exponentialdarstellungen unterstützt
> werden... noch nicht.

10E2 (als Beispiel) geht jedenfalls nicht :-(

von Thorsten (Gast)


Lesenswert?

Exponentialdarstellung musste ja selber machen (wenn die Sprache nix 
anderes kann als int, dann kann die auch keine 
exponentialdarstellung)...
exponenten addieren, mantissen muliplizieren und dann mantisse wieder 
normieren (auf eine sinnvolle zahl, evtl ist das sqrt(2^16-1) ) und 
exponent anpassen ...

von rene (Gast)


Lesenswert?

Vielleicht 2 x word zu verwenden ... damit kann man bis 4 GB darstellen

rene

von Peter D. (peda)


Lesenswert?

MAB wrote:
> Danke! Sorry ich dachte NQC ist eine gängige Sprache.


Ich höre davon auch zum erstan mal.

Im Profibereich wird wohl eher selten Lego gespielt.

Wenn etwas nicht unterstützt wird, mußt Du es wie unter Assembler 
machen: selber bauen.


Peter



von unsichtbarer WM-Rahul (Gast)


Lesenswert?

>Im Profibereich wird wohl eher selten Lego gespielt.

Sowas macht man noch an FH und Unis...

Was spricht denn dagegen, den Zahlenbereich manuell zu erweitern, so wie 
rene es vorgeschlagen hat.

von MAB (Gast)


Lesenswert?

Peter wrote:
> Wenn etwas nicht unterstützt wird, mußt Du es wie unter Assembler
machen: selber bauen.

Ja das wird wahrscheinlich
die einzige Möglichkeit sein
wie es aussieht.

>Im Profibereich wird wohl eher selten Lego gespielt.

Aber wie "unsichtbarer WM-Rahul" schon sagte an FH oder
Unis.

Gruß MAB

von marvin (Gast)


Lesenswert?

NQC ist ziemlich beschränkt, was die Möglichkeiten betrifft. Das 
aktuelle "Robo-Interface" von fischertechnik ist da wesentlich 
interessanter - es hat einen M16C30245-µC und es gibt einen kostenlosen 
C-Compiler von Renesas, der neben allen gängigen Integer-Formaten auch 
float und double unterstützt. Vielleicht mal mit dem Prof sprechen, ob 
nicht langsam mal etwas aktuelles angeschafft werden sollte ;)

von Martin Thomas (Gast)


Lesenswert?

Mindstrom-Kits sind nicht unüblich als Übungsplattform bei der "Embedded 
Systems"-Ausbildung. NQC ist ganz o.k., wenn man mit dem 
vorinstallierten Betriebssystem "spielen" will, aber wie bereits 
festgestellt etwas eingeschränkt. Deutlich mehr Möglichkeiten bietet ein 
gcc-Cross-Compiler für H8 und BrickOS als System. Damit dann auch keine 
Probleme mit uint32_t. Intro: 
http://brickos.sourceforge.net/documents.htm

von marvin (Gast)


Lesenswert?

Das Lego-Interface ist auch in anderer Hinsicht ziemlich beschränkt, 
denn es hat weniger Ausgänge. Das fischertechnik-Interface hat von Haus 
aus 8 Ausgänge (4 Motoren) und kann auf 32 Ausgänge (16 Motoren) 
erweitert werden.
Für kleinere Spielereien ist Lego einfacher und auch schneller 
zusammengebaut.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.