Ich habe die SPRACHENREFERENZ auf der Arduino-Website durchsucht und kann kein Nicht-Float-Äquivalent finden, das bedeutet, dass pow()
ich etwas Großes vermissen muss, aber für mein Leben bin ich ratlos! Ich habe pow()
in der Spalte FUNCTIONS unter der Überschrift Math gefunden (wie ich es erwarten würde), aber es heißt, dass beide Parameter [base] und [exponent] beide sind (float). Und es gibt nur sechs weitere Einträge unter der Überschrift "Mathematik". Keiner von ihnen scheint eine ganzzahlige Version zu sein. Ich möchte nur die Potenzen von 2 mit den Exponenten von 0 bis 10 erzeugen. Wie 2 ^ 0 = 1, dann 2 ^ 1 = 2, dann 2 ^ 2 = 4, dann 2 ^ 3 = 8, dann 2 ^ 4 = 16 2 ^ 5 = 32 dann 2 ^ 6 = 64 dann 2 ^ 7 = 128 dann 2 ^ 8 = 256 dann 2 ^ 9 = 512 dann 2 ^ 10 ist 1024
Kann ich dies nur mit Floats tun? Ich fange an, mich im Widerspruch zur Realität zu fühlen und habe meine Medikamente tatsächlich gezählt, aber ich bin genau dort, wo ich sein sollte. Lassen Sie mich im Voraus für dieses ungeheure Versehen entschuldigen, mit dem ich Ihre Zeit verschwendet habe, aber ich habe alle 9 Seiten mit Tags durchgesehen und jemals gesucht, was mir einfiel. Ich gebe zu, dass ich nicht so viel Zeit verbracht habe, aber ich war mir sicher, dass dies nur eine fünfminütige Sache sein würde!
quelle
Antworten:
Für den allgemeinen Fall ist die Antwort von @dat_ha richtig, aber es ist erwähnenswert, dass Sie einen ganz besonderen Fall wollen ... Zweierpotenzen. Da Computer binäre Arithmetik verwenden, stehen für Operationen mit Zweierpotenzen häufig einige Verknüpfungen zur Verfügung.
Das Multiplizieren einer Zahl mit einer Zweierpotenz kann durch die Linksverschiebungsoperation (
<<
) erreicht werden, die die Ziffern der binären Darstellung der Zahl (dh der Bits) buchstäblich nach links verschiebt. In Basis zwei entspricht das Verschieben von Bits um eine Stelle nach links dem Multiplizieren mit 2, genau wie in Basis 10 das Verschieben von Ziffern um eine Stelle nach links dem Multiplizieren mit 10. Für eine vollständige Erläuterung des Linksverschiebungsoperators in C ++ Siehe diese Antwort unter Stapelüberlauf .Es ist wichtig zu beachten, dass das Verschieben nach links Informationen verlieren kann. vom Ende verschobene Bits gehen verloren. Da Sie Potenzen von 2 bis 10 benötigen, sind Sie sicher, wenn Sie mit vorzeichenbehafteten Ganzzahlen arbeiten, die auf Arduino Uno einen Maximalwert von haben
2^15-1
.In Anbetracht dieser Einschränkungen ist hier eine Funktion zum Berechnen von Zweierpotenzen innerhalb dieser Einschränkungen. Dies ist ein sehr schneller Code, da die Linksverschiebungsoperation eine Operation mit sehr niedrigem Pegel ist und tatsächlich keine Multiplikation durchgeführt wird.
quelle
unsigned long
.Es arbeitet mit
int
,double
,long
undfloat
.unsigned long
undunsigned int
sollte auch funktionieren. Sie müssen NUR Floats verwenden.Hoffe es hat geholfen!
quelle
double
. Da das IEEE-Gleitkomma auf einer binären Mantisse / Exponent-Darstellung basiert, sollte jede Potenz von 2 auch über 2 ^ 53 hinaus genau darstellbar sein (der Punkt, an demdouble
nicht jede beliebige ganze Zahl dargestellt werden kann, eine 1-Einheit an der letzten Stelle der Mantisse ist größer als 1,0).pow()
für Ganzzahlen, aber AFAICT Arduino hat nicht einmal Hardware-Gleitkomma, daher ist es eine schreckliche Antwort. Eine ganze Zahlpow()
Implementierung wie diese , dass Läufe in log2 (n) Zeit multipliziert wird und ein Ergebnis zu akkumulieren Zugabe würde wahrscheinlich an Sicherheit grenzender Wahrscheinlichkeit eine bessere Leistung, und das Unterlassen der Bit - Verschiebungen Arbeit für Potenzen von 2 zu erwähnen , macht gerade dies eine schreckliche Antwort auf diese Frage.