collapse

* Posts Recentes

Amplificador - Rockboard HA 1 In-Ear por almamater
[27 de Março de 2024, 19:13]


O que é isto ? por KammutierSpule
[26 de Março de 2024, 19:35]


Bateria - Portátil por almamater
[25 de Março de 2024, 22:14]


Emulador NES em ESP32 por dropes
[13 de Março de 2024, 21:19]


Escolher Osciloscópio por jm_araujo
[06 de Fevereiro de 2024, 23:07]


TP4056 - Dúvida por dropes
[31 de Janeiro de 2024, 14:13]


Leitura de dados por Porta Serie por jm_araujo
[22 de Janeiro de 2024, 14:00]


Distancia Cabo por jm_araujo
[08 de Janeiro de 2024, 16:30]


Meu novo robô por josecarlos
[06 de Janeiro de 2024, 16:46]


Laser Engraver - Alguém tem? por almamater
[16 de Dezembro de 2023, 14:23]

Autor Tópico: Problema de calculo com a função pow(b,e)  (Lida 2717 vezes)

0 Membros e 1 Visitante estão a ver este tópico.

Offline jmf.robot

  • Mini Robot
  • *
  • Mensagens: 2
Problema de calculo com a função pow(b,e)
« em: 03 de Novembro de 2012, 10:23 »
Bom dia a todos,

Tenho um Arduino UNO R3 e ainda ando pelos primeiros programas.

Até agora, tudo tem funcionado "normalmente", até que me deparei com este problema... Ao converter valores binarios para valores decimais obtive a maior parte dos resultados errados.

Depois de um par de horas a "bater com a cabeça", apercebi-me que a função pow() estava a devolver resultados errados.

Abaixo envio-vos os exemplos do programa, que me permitiu detectar o erro e o output do mesmo.
Código: [Seleccione]
void setup()
{
  Serial.begin(57600);
  delay(500);
}

void loop()
{
  for(int n=0;n<12;n++)
  {
    long valor=pow(2,n);   
    String aa="pow(2,"+String(n)+") = "+String(valor);
    Serial.println(aa);
    delay(500);
  }
}

output:

(como podem ver no print screen, 20=1 (ok) 21=2 (ok) 23=7 (aqui começa o disparate...)
Gostaria de saber se já alguém se deparou com este erro. Será um problema especifico deste Arduino ? É um bug ? ... ou, simplesmente é um problema "entre o teclado e a cadeira"  :) ? (como habitualmente eu costumo dizer quando é um problema do utilizador)

Agradeço a vossa ajuda
JMiguel

PS: Contornei o problema criando um nova função pow(), mas parece-me muito estranho que possa existir um bug deste tipo sem que ninguem ainda tenha dado por isso e sem que se tenha já resolvido.
Código: [Seleccione]
long funcao_pow(int num, int pot)

  long result=1;
  if(pot==0) return(1);
  for (int i=1;i<=pot;i++){result*=num;}
  return(result);
}

com esta função, os resultados estão OK

Offline jmf.robot

  • Mini Robot
  • *
  • Mensagens: 2
Re: Problema de calculo com a função pow(b,e)
« Responder #1 em: 03 de Novembro de 2012, 11:09 »
Acho que o problema, estava (como 99.99%) das vezes "entre o teclado e a cadeira"  :-[

acabei de reler o Arduino Reference e a função é: double pow(float base, float exponent) ... pois é... eu estava a tratar o resultado como long, e estava a mandar os argumentos como int

...ou seja, só estava a pensar no caso especifico que eu necessitava, e a função é muito mais ampla. Permite também o calculo de raizes com o indice que se queira.

Neste caso, tudo ficou resolvido com esta simples alteração:
Código: [Seleccione]
void setup()
{
  Serial.begin(57600);
  delay(500);
}

void loop()
{
  for(int n=0;n<12;n++)
  {
    double valor=pow(2,n);   
    Serial.println(valor);
    delay(500);
  }
}


e neste caso o output já está OK

1.00
2.00
4.00
8.00
16.00
32.00
64.00
128.00
256.00
512.00
1024.00
2048.00

Obrigado em qualquer das formas. (e se alguém voltar a encontrar este "mega-bug", já sabe... nunca se perde ler uma segunda vez o Auduino Reference, ehehe  :)  )

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.733
  • Helpdesk do sitio
Re: Problema de calculo com a função pow(b,e)
« Responder #2 em: 03 de Novembro de 2012, 14:05 »
Se é para potências de dois usa shift-lefts que são feitos em meia duzia de instruções em vez de em milhares delas.
Basta:
uint16_t i = 1<<(uint16_t)var;

O cast convem ser feito explicitamente, mas em principio para 16 bits não precisas de o fazer.
Avr fanboy