Forum: Compiler & IDEs Zahlenraum von Berechnungen


von Bjoern (Gast)


Lesenswert?

Hallo,
ich habe folgendes Problem:
Ich möchte einen BMP180-Drucksensor mit einem ATtiny 84A zum laufen 
bekommen. Leider muss man um die richtigen Werte zu bekommen ziemlich 
viel mit den internen Kalibrationswerten herumrechnen, und das klappt 
einfach nicht.
Zum Beispiel folgendes:

bmp180_cal.X2 = ((int32_t) bmp180_cal.MC * 2^11);

bmp180_cal.X2 ist vom Typ int32_t, bmp180_cal.MC ist -11786 und int16_t.
Ich erwarte ein Ergebniss von -24137728, es kommt jedoch -23577 heraus.
Die Berechnung sollte ja im größeren Zahlenbereich ausgeführt werden, 
also 32Bit. Also eigentlich kein Problem, oder? (2l statt 2 hilft auch 
nicht.)

Was mache ich falsch, ich komme einfach nicht drauf.

von Thatguy (Gast)


Lesenswert?

Schau dir mal die Definition des ^ Operators an.

von Peter II (Gast)


Lesenswert?

Bjoern schrieb:
> Was mache ich falsch, ich komme einfach nicht drauf.

das cast ist an der falschen stelle.

so könnte es gehen:
bmp180_cal.X2 = ((int64_t)bmp180_cal.MC) * 2^11);

aber was soll das 2^11?

das ist nicht 2 hoch 11 sondern

http://de.wikibooks.org/wiki/C-Programmierung:_Ausdr%C3%BCcke_und_Operatoren#Bitweises_exklusives_ODER_.28XOR.29_.5E

von Daniel A. (daniel-a)


Lesenswert?

der ausdruck  2^11  ist nicht 2 hoch 11 sondern 2 xor 11
verwende hier eien bitshift.
bmp180_cal.X2 = (((int32_t) bmp180_cal.MC)<<11)

von Karl H. (kbuchegg)


Lesenswert?

Manchmal ist es auch vernünftig, nicht zu faul zu sein, sondern sich 
einen Taschenrechner zu schnappen und 2 hoch 11 selbst auszurechnen, 
wenn man schon nicht die Werte der 2-er Potenzen auswendig kennt.

2 hoch 11 ergibt 2048. Also einfach anstatt des Künstlens
1
   bmp180_cal.X2 = (int32_t) bmp180_cal.MC * 2048L;
und dann klappts.
Zugegeben, macht nicht soviel hier wie das Anschreiben als 2-er Potenz. 
Aber irgendwo muss man auch Abstriche machen. Im Gegenzug ist dafür die 
Operation selbst für Grundschulkinder leicht zu verstehen.

: Bearbeitet durch User
von Bjoern (Gast)


Lesenswert?

Danke, das Brett vor dem Kopf ist endlich weg, wie doof...
Läuft endlich.

von Bla (Gast)


Lesenswert?

<< 11

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.