Я просмотрел ССЫЛКУ НА ЯЗЫКЕ на веб-сайте Arduino , и я не могу найти эквивалент, не относящийся к Float, pow()
я должен упустить что-то большое, но для жизни я в тупике! Я нашел pow()
в столбце FUNCTIONS под заголовком Math (как я и ожидал), но он говорит, что оба параметра, [base] и [exponent] оба (float). И есть только шесть других записей под заголовком Math; ни один из них не кажется целочисленной версией. Все, что я хочу сделать, это сгенерировать степени 2, используя показатели от 0 до 10. Например, 2 ^ 0 = 1, затем 2 ^ 1 = 2, затем 2 ^ 2 = 4, затем 2 ^ 3 = 8, затем 2 ^ 4 = 16, затем 2 ^ 5 = 32, затем 2 ^ 6 = 64, затем 2 ^ 7 = 128, затем 2 ^ 8 = 256, затем 2 ^ 9 = 512, затем 2 ^ 10 - 1024
Является ли использование поплавков единственным способом, которым я могу это сделать? Я начинаю чувствовать, что я не соглашаюсь с реальностью, и фактически посчитал мои лекарства, но я именно там, где и должен быть. Позвольте мне заранее извиниться за этот вопиющий недосмотр, с которым я потратил впустую ваше время, но я просмотрел все 9 страниц тегов и провел поиск, о котором только мог подумать. Я признаю, что я не потратил все ЭТО много времени, но я был уверен, что это будет всего лишь пять минут!
источник
Ответы:
В общем случае ответ @dat_ha правильный, но стоит отметить, что вам нужен очень особый случай ... степени двойки. Поскольку компьютеры используют двоичную арифметику, для операций с степенью двойки часто доступны некоторые ярлыки.
Умножение числа на степень два может быть выполнено с помощью операции сдвига влево (
<<
), которая буквально сдвигает цифры двоичного представления числа (то есть биты) влево. Во второй базе сдвиг битов на одну позицию влево - это то же самое, что умножение на 2, точно так же, как в базовой 10 сдвиг цифр на одну позицию влево - это умножение на 10. Для полного объяснения оператора сдвига влево в C ++ см. этот ответ на переполнение стека .Важно отметить, что сдвиг влево может привести к потере информации; биты, сдвинутые с конца, теряются. Поскольку вам нужны полномочия от 2 до 10, вы в безопасности при работе со знаковыми целыми числами, которые имеют максимальное значение в
2^15-1
Arduino Uno .Учитывая эти предостережения, вот функция для вычисления степеней двух в этих ограничениях. Это очень быстрый код, потому что операция левого сдвига является операцией очень низкого уровня, и умножение фактически не выполняется.
источник
unsigned long
.Он работает с
int
,double
,long
иfloat
.unsigned long
иunsigned int
должен также работать. Вы не обязаны использовать ТОЛЬКО поплавки.Надеюсь, это помогло!
источник
double
. На самом деле, поскольку плавающая точка IEEE основана на двоичном представлении мантиссы / экспоненты, каждая степень 2 должна быть точно представима даже за пределами 2 ^ 53 (точка, гдеdouble
не может быть представлено любое произвольное целое число, 1 единица в последнем месте мантисса больше 1,0).pow()
целых чисел, но AFAICT arduino даже не имеет аппаратной плавающей запятой, поэтому это ужасный ответ. Целочисленнаяpow()
реализация, подобная этой, которая выполняется с умножением и сложением времени в log2 (n), скорее всего, будет работать лучше, и если не упомянуть, что сдвиги битов работают для степеней 2, то это просто ужасный ответ на этот вопрос.