Przeszukałem REFERENCJĘ JĘZYKOWĄ na stronie internetowej Arduino i nie mogę znaleźć odpowiednika innego niż Float. pow()
Muszę przegapić coś dużego, ale dla mojego życia jestem zakłopotany! Znalazłem pow()
w kolumnie FUNKCJE pod nagłówkiem Math (jak bym się spodziewał), ale mówi, że oba parametry, [baza] i [wykładnik] są oba (zmiennoprzecinkowe). I jest tylko sześć innych pozycji pod nagłówkiem Math; żadna z nich nie wydaje się być wersją całkowitą. Wszystko, co chcę zrobić, to wygenerować potęgę 2 za pomocą wykładników od 0 do 10. Jak 2 ^ 0 = 1, a następnie 2 ^ 1 = 2, a następnie 2 ^ 2 = 4, a następnie 2 ^ 3 = 8, a następnie 2 ^ 4 = 16, a następnie 2 ^ 5 = 32 następnie 2 ^ 6 = 64 następnie 2 ^ 7 = 128 następnie 2 ^ 8 = 256 następnie 2 ^ 9 = 512, a następnie 2 ^ 10 to 1024
Czy używanie pływaków jest jedynym sposobem, w jaki mogę to zrobić? Zaczynam czuć się jak w sprzeczności z rzeczywistością i faktycznie policzyłem moje leki, ale jestem dokładnie tam, gdzie powinienem być. Przepraszam z góry za ten okropny nadzór, nad którym zmarnowałem twój czas, ale przejrzałem wszystkie 9 stron tagów i przeprowadziłem wyszukiwanie, o którym mogłem pomyśleć. Przyznaję, że nie spędziłem tak dużo czasu, ale byłem pewien, że to będzie tylko pięć minut!
źródło
Odpowiedzi:
W ogólnym przypadku odpowiedź @dat_ha jest poprawna, ale warto zauważyć, że chcesz bardzo szczególnego przypadku ... potęgi dwóch. Ponieważ komputery używają arytmetyki binarnej, operacje obejmujące potęgi dwóch często mają dostępne skróty.
Mnożenie liczby przez potęgę dwóch można osiągnąć za pomocą operacji przesunięcia w lewo (
<<
), która dosłownie przesuwa cyfry binarnej reprezentacji liczby (tj. Bitów) w lewo. W bazie drugiej przesunięcie bitów o jedno miejsce w lewo jest takie samo jak pomnożenie przez 2, tak samo jak w bazie 10 przesunięcie cyfr o jedno miejsce w lewo jest takie samo jak pomnożenie przez 10. Dla pełnego wyjaśnienia operatora lewej zmiany w C ++ zobacz tę odpowiedź na temat przepełnienia stosu .Należy zauważyć, że przesunięcie w lewo może spowodować utratę informacji; bity odsunięte od końca są tracone. Ponieważ potrzebujesz mocy od 2 do 10, jesteś bezpieczny podczas pracy z podpisanymi liczbami całkowitymi, które mają maksymalną wartość
2^15-1
na Arduino Uno .Biorąc pod uwagę te zastrzeżenia, oto funkcja do obliczania potęg dwóch w ramach tych ograniczeń. Jest to bardzo szybki kod, ponieważ operacja przesunięcia w lewo jest operacją bardzo niskiego poziomu i faktycznie nie jest wykonywane mnożenie.
źródło
unsigned long
.Współpracuje z
int
,double
,long
ifloat
.unsigned long
iunsigned int
powinien również działać. Nie musisz używać TYLKO pływaków.Mam nadzieję, że to pomogło!
źródło
double
. W rzeczywistości, ponieważ zmiennoprzecinkowy IEEE opiera się na binarnej reprezentacji mantysy / wykładnika, każda potęga 2 powinna być dokładnie reprezentowana nawet powyżej 2 ^ 53 (punkt, w którymdouble
nie może reprezentować każdej dowolnej liczby całkowitej, 1 jednostki w ostatnim miejscu mantysa jest większa niż 1,0).pow()
liczb całkowitych, ale arduino AFAICT nawet nie ma zmiennoprzecinkowego sprzętu, więc jest to straszna odpowiedź.pow()
Implementacja liczb całkowitych takich jak ta, która działa w czasie log2 (n) mnożenia i dodawania w celu skumulowania wyniku, prawie na pewno prawdopodobnie działałaby lepiej, a nie wspominając, że przesunięcia bitów działają dla potęg 2, to po prostu okropna odpowiedź na to pytanie.