Multiplicação FLOAT * INT

No código abaixo alguem poderia explicar a necessidade de no divisor estar o valor 1024.0 e não simplesmente 1024 ? Os dois operadores precisam ser float ?

void loop(){
    int adcValue = analogRead(A1);  // Raw value 
    float voltage = adcValue * 4.096/1024.0;  // Voltage calculation
    Serial.print("Analog Value: ");
    Serial.println(adcValue);
    Serial.print("Voltage [V]: ");
    Serial.println(voltage,3);
    delay(1000);      
}

De uma perspectiva de especificação C++ pura em promoções de tipo e prioridades de operadores ao avaliar expressões matemáticas, o compilador primeiro avaliará adcValue * 4.096 e depois dividirá por 1024.

adcValue é um int e 4.096 é um float. A regra afirma que, como há um operando float, adcValue será promovido a float e a operação será conduzida como float e o tipo intermediário resultante é float

então você faria intermediaryResult / 1024. Novamente, como intermediaryResult é um float e 1024 é um int, a regra afirma que 1024 será promovido a float e a operação será conduzida como float e o tipo final resultante é float

resumindo, não - o 1024.0 não era necessário, mas é uma boa prática e uma maneira fácil de garantir que a fórmula funcione da maneira que você espera se não conhecer as regras.

E tu consegues explicar porque é que tens 4.096/1024.0 em vez de 0.004?

Deve ter sido para melhor compreensão do cálculo. Não fui eu quem fez esse código. É só um exemplo.

exatamente. e o compilador provavelmente otimizará isso

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