Go Down

Topic: Mathe: v1*2 hochX (Read 2305 times) previous topic - next topic

Hallo,

ich habe mal wieder eine Frage.
Wie kann ich mit dem Arduino folgende Rechnung anstellen:
float T1 = T2*(2 hoch T3);

Bin für Hilfe dankbar,
Stefan

squaremeter

Das korrekte Zeichen für eine Potenz ist in "der" schreibweise 2^3(2 hoch 3)
ob das der Compiler versteht weiß ich nicht aber vielleicht hilft es dir ja trotzdem weiter.

LG M²


MaFu

So funktionierts auch nicht. Dafür ist in C die Funktion pow() zuständig.
_______
Manfred

Joghurt

#4
Jul 28, 2011, 08:20 am Last Edit: Jul 28, 2011, 08:22 am by Joghurt Reason: 1

Wie kann ich mit dem Arduino folgende Rechnung anstellen:
float T1 = T2*(2 hoch T3);


Im speziellen Fall von "2^" sollte auch folgendes gehen, das ist schneller und sicherer als pow():
(pow() hat bei mir schon das ein oder andere Mal "Näherungswerte" ausgespuckt. :()

Code: [Select]
T1 = T2*(1<<T3);

Btw. ist die Konvention normalerweise so dass Variablen vorne klein geschrieben werden. Erhöht die Lesbarkeit... ;)

Oh super,

also T1 = T2 * pow(2,T3); funktioniert sehr gut.
Was genau macht das hier "<<" ?

Ich werde meine Variablen umstellen, lesbarkeit ist kein Fehler. Danke


Joghurt


Was genau macht das hier "<<" ?


Guckst Du auf der immer hilfreichen Referenzseite nach "<<"... ;)

Im Prinzip macht das ein "*2", und zwar so oft wie die Zahl die hinter dem "<<" steht.
Und mit "1" vor dem "<<" ist das das Gleiche wie ein "2^" und damit genau das was Du möchtest. :)

Der besondere Vorteil ist dass Bitshift-Operationen nur einen Taktzyklus dauern, wohingegen schon eine Multiplikation zwei Taktzyklen kostet und die Benutzung der pow()-Funktion, da sie ja eine Funktion ist, noch ein gutes Stück länger dauert. ;)

MaFu

#7
Jul 28, 2011, 08:48 am Last Edit: Jul 28, 2011, 08:50 am by MaFu Reason: 1
<< und >> verschieben die Bits des Wertes um die angegebene Anzahl Stellen nach links bzw. rechts. Jede Stelle um die verschoben wird entspricht einer Multiplikation mit 2 bzw Division durch 2. Darum passt es im vorliegenden Fall auch nur für die Zahl 2.
_______
Manfred

Das ist ja super! Performance wäre jetzt meine nächste Frage gewesen.
Vielen Dank - das bitweise verschieben im binären ist sehr edel - da wäre ich nicht drauf gekommen!

voithian


Das ist ja super! Performance wäre jetzt meine nächste Frage gewesen.
Vielen Dank - das bitweise verschieben im binären ist sehr edel - da wäre ich nicht drauf gekommen!


Aber schön dran denken, dass die Verschieberei nur bei Typen wie char, int, long und den vorzeichenlosen "Brüdern" davon funktioniert. pow() hingegen kann auch mit Gleitkommazahlen als Basis und Exponent arbeiten.

Okay, ich werde wohl unsigned long nehmen, es geht um einen kleinen Taschenkomputer zur Belichtungssteuerung einer Kamera... Es dreht sich also um Millisekunden.

So, nun habe ich meine Formel fertig. Ich werde wohl pow() nehmen, weil ich (natürlich) auch Kommawerte verwenden muss. Das habe ich wohl übersehen. Ich habe einen kleinen Test gemacht und die Berechnung (5*pow) benötigt 584 Mikrosekunden. Damit kann ich gut leben und danke hiermit allen Helfern!


Go Up