Rechenfehler beim Arduino nano

Ich hab ein seltsames phänomen....

Bin grad dabei, mehrere Zahlen miteinander zu kombinieren.

ich wollte von verschiedenen Statusen (0 oder 1) diese in einer Reihe weitergeben.
Ich bin drangescheitert, daß 00000 nicht funktioniert.
Es kommt immer nur 0 raus.

Nun wollt ich n Schritt weitergehen, und dann 10/11, 20/21, etc. machen, das funktioniert soweit,
nur ergibt 3010000 = -27680, bei unsigne long gibt das 37856.
normalerweise sollte 30
10000 aber 300000 ergeben.

Was iss da faul?
Das liegt irgendwie an den 10000 auch wenn ich 11000 mache, ich bekomme alles, nur nicht das, was es soll.
wenn ich 100000 oder 1000 mache ist alles ok.

Als ich aber eine For-Schleife machen wollte,um rauszufinden, ab wann er falsch rechnet, stimmt wieder alles.

Die ganze Schleife, alle Rechnungs korrekt, von 30 * 1000 bis 30 * 100000

Serial.print(30 * 10000); gibt -27680
Aber ich brauch das ja in einer Variable, also auch

int var1 = 30;
unsigned long var = var1 * 10000; gibt nicht das, was es sollte.

Was da los?

Kapier ich nicht - zeig den Sketch und benutze dazu die Code-Tags.

Serial.print(30 * 10000); gibt -27680

Wenn du nichts angibst wird immer in int gerechnet. Das gibt natürlich einen Überlauf

Also mit dene 10000 stimmt definitiv was ned.

Habs jetzt gelöst, indem ich die 10000 in eine Variable geschrieben habe.

unsigned long zk = 10000;

int var1 = 30;

var1 * zk ergibt 300000
var1 * 10000 ergibt -27680

so funktionierts.

Dennoch seltsam und mir völlig unerklärlich.

An den Variablen kanns normal ned liegen, da sind nur zehner Werte drin.
Und die Variable, in der die endgültige Zahl drin sein soll, ist auch ok, denn die Zahl 1020000000 ist ja drin.

ich wiederhole mich: Wenn du nichts angibst wird immer in int gerechnet.

Was du willst ist var1 * 10000UL

hi,

Dir muß klar werden, daß immer ERST berechnet wird, und dann erst wird das ergebnis Deiner variablen "mitgeteilt".

wenn Du also
unsigned long ergebnis = 30 * 10000

berechnen läßt, wird zuerst:

30 * 10000

berechnet, also zwei int, das ergebnis ist dann IMMER auch ein int, da kommt es zum überlauf. daß Du dieses "falsche" ergebnis in ein unsigned long schreibst, ändert das nichts mehr. wenn Du allerdings

30 * 100000

berechnen läßt, ist das ein int mal ein long, so ist das ergebnis auch ein long und daher richtig. Du mußt also dafür sorgen, daß einer der faktoren eine zahl ist, die praktisch "groß genug" ist, damit das ergebnis dann auch "reinpaßt". natürlich kannst Du nicht einfach 10000 größer machen, aber wenn Du die 10000 in einer long-varaiablen speicherst , erreichst Du genau das.

oder eben einfacher mit 10000UL, damit ist es ein unsigned long mit inhalt 10000.

gruß stefan

Dieser Rechenfehler kommt daher daß Du eine zu große Zahl in eine kleine Variable speichern willst.
eine int-Variable kann eine Zahl zwischen ca -32000 und ca 32000 speichern. Wenn Du einen größere zahl reinschreibst werden die höherwertigen Bits einfach ins nichts geschickt und die 16 unteren Bite in die Variable gespeichert, wobei das höherwertigste Bit das Vorzeichen darstellt.
Daher kommen diese unlogischen Rechenergebnisse.

Grüße Uwe

SkyRanger:
ich wollte von verschiedenen Statusen (0 oder 1) diese in einer Reihe weitergeben.

Kann es sein, daß Du das Binärsystem noch nicht verstanden hast?

Es grenzt schon an eine Vergewaltigung, wenn man einen Arduino 10/11 ausrechnen läßt, wenn man den gewünschten Effekt auch mit Schieben erreichen kann. Also zum Verschicken sowas wie:

 unsigned aus = (s0<<0) | (s1<<1) | (s2<<2)...
 Serial.print(aus, BIN); //nur zur Kontrolle

Und wenn Dir 0 nicht gefällt, häng noch ein (1<<15) dran.

Auspacken entsprechend:

 bool s0 = ein & (1<<0);
 bool s1 = ein & (1<<1);
 bool s2 = ein & (1<<2);
 usw.

SkyRanger:
Ich hab ein seltsames phänomen....
...
ich wollte von verschiedenen Statusen (0 oder 1)...

Was bitte sind "Statusen" ?

HotSystems:
Was bitte sind "Statusen" ?

Statusen ist (und nicht sind) "der Status" auf Schwedisch und Norwegisch.

https://en.wiktionary.org/wiki/statusen

Dass Stati oder Zustände gemeint waren haben wir wohl alle verstanden, oder?

Whandall:
Statusen ist (und nicht sind) "der Status" auf Schwedisch und Norwegisch.

Echt geil. Danke...danke für deine Erklärung.

Dass Stati oder Zustände gemeint waren haben wir wohl alle verstanden, oder?

Das hoffe ich doch.

Heute darf man doch auch bestimmt "Statusse" sagen, oder?
Denn die Mehrzahl von Kaktus ist ja auch mittlerweile Kaktusse.
8) 8) 8) 8) 8)

Sicher?
Nicht Kaktüsse?

Weil Kuss -> Küsse
Kaktus-> ?
:slight_smile:

ElEspanol:
Sicher?
Nicht Kaktüsse?

Weil Kuss -> Küsse
Kaktus-> ?
:slight_smile:

Dann aber auch ...-> Statüsse, gell.

Also, wenn wir schon dabei sind, die Mehrzahl von 'der Status' ist auch nicht 'die Stati', sondern 'die Status' - auch wenn's komisch aussieht :wink:
Der Duden ist dein Freund

und auch hier kann man es nachlesen:
https://de.wiktionary.org/wiki/Status

Kaktusse kann man umgangssprachlich lt Duden schon sagen, küssen sollte man sie aber nicht :wink: .....

combie:
Heute darf man doch auch bestimmt "Statusse" sagen, oder?

Als Lateiner habe ich schon vor Jahrzehnten festgestellt, daß die korrekte Mehrzahl ebenfalls "Status" ist, nur mit einem langen u (U-Deklination). Auf Altdeutsch würde ich die Dinger "Zustände" nennen, oder auf Neudeutsch "States" :-]

Die Frage nach dem Rechenfehler sollte inzwischen ja hinreichend geklärt sein. Was die ganze Diskussion mit der Weitergabe von Zuständen zu tun hat, ist mir dabei immer noch schleierhaft. Aber solange noch etwas Unterhaltung für die armen Daheimgebliebenen an langweiligen Sonntagen herauskommt... :wink: