Sulfixo de Variavel (1023.)

Procurei explicação e não encontrei porque a formula abaixo dá
resultados diferentes se usar 1023 ou (1023. ou 1023.0 ou 1023.f)

adc10 = 578;
mv = adc10 * (5000 / 1023. ); //precisa ter o ponto no 1023. o mesmo que 1023.f ou 1023.0
ohm = (mv * 39000) / (5000 - mv) / 1000;
ohm = ohm - 0.79;
Serial.print("OhmA= ");
Serial.print(ohm, 2);
Serial.println("K");

Ola,
para que possamos entender o projeto e a dificuldade,
sempre que for postar um código, use as tags recomendadas </> e poste o código completo.

Como estão definidas as variáveis adc10 , mv , ohm ?

As variáveis são tipo float.

Não coloquei o código entre as tags porque é uma parte bem pequena e não necessariamente para rodar.

Ola,
rode este codigo e veja se voce descobre a razão por voce mesmo.



float adc10;
float mv;
float ohm;
void setup() {
  Serial.begin(115200);
  adc10 = 578;
  mv = adc10 * (5000 / 1023 ); //precisa ter o ponto no 1023. o mesmo que 1023.f ou 1023.0
  Serial.println(5000 / 1023 );
  Serial.println(adc10 * (5000 / 1023) );
  ohm = (mv * 39000) / (5000 - mv) / 1000;
  ohm = ohm - 0.79;
  Serial.print("OhmA= ");
  Serial.print(ohm, 2);
  Serial.println("K");

  adc10 = 578;
  mv = adc10 * (5000 / 1023. ); //precisa ter o ponto no 1023. o mesmo que 1023.f ou 1023.0
  Serial.println(5000 / 1023. );
  Serial.println(adc10 * (5000 / 1023.) );
  ohm = (mv * 39000) / (5000 - mv) / 1000;
  ohm = ohm - 0.79;
  Serial.print("OhmA= ");
  Serial.print(ohm, 2);
  Serial.println("K");
}

void loop() {
  // put your main code here, to run repeatedly:

}

Sim. Eu já tinha visto a razão de isso ocorrer mas não encontrei
essa explicação na Referencia.

Nem um arredondamento ocorre.....

Isto acontece muitas vezes porque o compilador acha-se mais inteligente que tu e usa variáveis inteiras no cálculo intermédio truncando assim o resultado.

Isto acontece com experiência e pode ser evitado com truques como:

mv = adc10 * (5000 / 1023 ); //o código original

//ou 

mv = (adc10 * 5000) / 1023; // aqui não importa se as variáveis usadas pelo compilador são inteiros ou não e a última operação dá-te um float que é o que a variável mv está à espera. 

//podes também fazer um cast para forçar o tipo... 

mv =  (float) (adc10 * 5000) / 1023; 

//ou 

mv = adc10 * 4.88758553275; 

Poxa , que coisa hein. Eu programando Arruíno há uns 3 anos e só agora estou vendo isso.... Não lembro de ter visto isso em nenhuma referencia. Fico agora imaginando se nos inúmeros programas que já escrevi quais poderiam ter ido com esse bug...

Não é um bug. É a maneira como a linguagem funciona.

Tem razão. A palavra foi mal colocada. Mas achei a documentação sucinta demais.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.