Eu vasculhei a REFERÊNCIA DE IDIOMA no site do Arduino e não consigo encontrar um equivalente que não seja do tipo Float para pow()
que eu esteja perdendo algo grande, mas, para a minha vida, estou perplexo! Eu encontrei pow()
na coluna FUNCTIONS sob o cabeçalho Math (como eu esperaria), mas diz que ambos os parâmetros, [base] e [expoente] são ambos (float). E há apenas seis outras entradas sob o cabeçalho Math; nenhum deles parece ser uma versão inteira. Tudo o que eu quero fazer é gerar os poderes de 2 usando os expoentes de 0 a 10. Como 2 ^ 0 = 1 então 2 ^ 1 = 2 então 2 ^ 2 = 4 então 2 ^ 3 = 8 então 2 ^ 4 = 16 então 2 ^ 5 = 32 então 2 ^ 6 = 64 então 2 ^ 7 = 128 então 2 ^ 8 = 256 então 2 ^ 9 = 512 então 2 ^ 10 é 1024
O uso de carros alegóricos é a única maneira de fazer isso? Estou começando a sentir que estou em desacordo com a realidade e, na verdade, contei minha medicação, mas estou exatamente onde deveria estar. Deixe-me desculpar-me antecipadamente por essa supervisão flagrante com a qual perdi seu tempo, mas passei por todas as 9 páginas de tags e fiz todas as pesquisas que consegui pensar. Admito que não passei tanto tempo assim, mas tinha certeza de que isso seria uma coisa de cinco minutos!
fonte
Respostas:
Para o caso geral, a resposta de @dat_ha está correta, mas vale a pena notar que você deseja um caso muito especial ... potências de dois. Como os computadores usam aritmética binária, as operações que envolvem potências de dois geralmente têm alguns atalhos disponíveis.
A multiplicação de um número por uma potência de dois pode ser realizada pela operação de deslocamento à esquerda (
<<
), que literalmente muda os dígitos da representação binária do número (ou seja, bits) para a esquerda. Na base dois, mudar os bits de um lugar para a esquerda é o mesmo que multiplicar por 2, assim como na base 10 os dígitos de deslocamento um lugar para a esquerda é o mesmo que multiplicar por 10. Para obter uma explicação completa do operador de deslocamento à esquerda em C ++ , consulte esta resposta no Stack Overflow .É importante observar que o deslocamento para a esquerda pode perder informações; bits deslocados no final são perdidos. Como você precisa de potências de 2 a 10, você está seguro ao trabalhar com números inteiros assinados, com um valor máximo
2^15-1
no Arduino Uno .Dadas essas advertências, aqui está uma função para calcular potências de duas dentro dessas restrições. Este é um código muito rápido, porque a operação de deslocamento à esquerda é uma operação de nível muito baixo e nenhuma multiplicação é realmente executada.
fonte
unsigned long
.Ele funciona com
int
,double
,long
efloat
.unsigned long
eunsigned int
também deve funcionar. Você não é obrigado a usar APENAS carros alegóricos.Espero que tenha ajudado!
fonte
double
. Na verdade, como o ponto flutuante IEEE é baseado em uma representação binária de mantissa / expoente, toda potência de 2 deve ser exatamente representável até além de 2 ^ 53 (o ponto emdouble
que não pode representar todo número inteiro arbitrário, uma unidade no último lugar do mantissa é maior que 1,0).pow()
de números inteiros, mas o AFAICT arduino nem tem ponto flutuante de hardware, por isso é uma resposta terrível. Umapow()
implementação inteira como esta que é executada no tempo log2 (n) multiplicando e adicionando para acumular um resultado provavelmente certamente teria um desempenho melhor, e deixar de mencionar que a troca de bits funciona para potências de 2 apenas faz desta uma péssima resposta a esta pergunta.