Go Down

Topic: super errore incompressibile con pow(base,esponente) (Read 598 times) previous topic - next topic

ilmandorlone

provate anche voi magari è il mio arduino che è partito o sono io che non capisco la logica.
codice che ho usato
Code: [Select]

  int b=0;
  int f=0;
  void setup() {
    Serial.begin(9600);
  }
  void loop() {
    b=pow(10,f);
    f=f+1;
    Serial.println(b);
    delay(2000);
  }

pensando con un po di logica di come dovrebbe andare il programma B a ogni ciclo dovrebbe essere uguale a 10 elevato a f.
dato che f a ogni ciclo aumenta di uno teoricamente b è uguale a:
0
10
100
1000 ecc.. non è così??
quando vado sul serial monito mi stampa tutt'altro
1
10
99
999
9999
dove sbaglio?

brunol949

#1
May 06, 2012, 05:24 pm Last Edit: May 06, 2012, 05:26 pm by brunol949 Reason: 1

quando vado sul serial monito mi stampa tutt'altro
1

10 elevato a 0 mi "sembra" dia 1 come risultato ; almeno la mia calcolatrice lo conferma

per il resto non so'
Hai provato a mettere b come unsigned ?
Le mie opere : Flusso correnti nell'impianto fotovoltaico http://arduino.webveneto.net/energy_control/     PING ed E.Mail http://arduino.web

leo72

Powe lavora su dati di tipo FLOAT, quindi gli arrotondamenti portano a valori a volte incomprensibili.

http://arduino.cc/en/Reference/Pow

ilmandorlone

Quote
10 elevato a 0 mi "sembra" dia 1 come risultato ; almeno la mia calcolatrice lo conferma

si scusa hai ragiona ma la mia calcolatrice dice che 10 alla 2 fa 100 no 99

Quote
Hai provato a mettere b come unsigned ?

cosa intendi ?

ilmandorlone

grazie @leo72 già meglio ora restituisce

1
1.00
10.00
100.00
1000.00
10000.00
99999.98
999999.68
9999984.00
99999968.00
999999616.00
0.00
0.00
0.00
0.00

leo72

Un microcontrollore non ha una ALU per cui le funzioni matematiche sono realizzate in software: di base il micro supporta nativamente (in hardware) solo addizioni, sottrazioni e moltiplicazioni. Le altre operazioni sono implementate in software, la potenza è una di queste.

brunol949


Quote
Hai provato a mettere b come unsigned ?

cosa intendi ?

Non sona andato a vedere pow ma sospettavo cio' che Leo ha scritto
L'unsigned era un modo per non prendere in considerazione valori negativi ... ma se e' float ...

Mi sa' che ti conviene fare un for con f come indice e ripeterlo al posto del pow
Le mie opere : Flusso correnti nell'impianto fotovoltaico http://arduino.webveneto.net/energy_control/     PING ed E.Mail http://arduino.web

brunol949

#7
May 06, 2012, 05:39 pm Last Edit: May 06, 2012, 05:42 pm by brunol949 Reason: 1

moltiplicazioni.
Le altre operazioni sono implementate in software, la potenza è una di queste.

Certo che pow e' implementata male
In definiva dietro alla funzione pow mascheri un ciclo for e fai delle semplici moltiplicazioni che si spera siano giuste  :)
for o un meccanismo equivalente che faccia 10*10*10.... in base all'esponente
Le mie opere : Flusso correnti nell'impianto fotovoltaico http://arduino.webveneto.net/energy_control/     PING ed E.Mail http://arduino.web

ilmandorlone

altrimenti lascio che a f a ogni ciclo si moltiplica per 10
f=1
void loop() {
f=f*10
}

non mi ispira più di tanto ma mi accontento :/

Go Up