Pages: [1]   Go Down
Author Topic: super errore incompressibile con pow(base,esponente)  (Read 498 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Sr. Member
****
Karma: 2
Posts: 397
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

provate anche voi magari è il mio arduino che è partito o sono io che non capisco la logica.
codice che ho usato
Code:
  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?
Logged

Malo ( VI )
Offline Offline
Sr. Member
****
Karma: 0
Posts: 372
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 ?
« Last Edit: May 06, 2012, 10:26:27 am by brunol949 » Logged

Le mie opere : Flusso correnti nell'impianto fotovoltaico http://arduino.webveneto.net/energy_control/     PING ed E.Mail http://arduino.web

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 313
Posts: 21619
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

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


Offline Offline
Sr. Member
****
Karma: 2
Posts: 397
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 ?
Logged

Offline Offline
Sr. Member
****
Karma: 2
Posts: 397
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 313
Posts: 21619
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged


Malo ( VI )
Offline Offline
Sr. Member
****
Karma: 0
Posts: 372
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Le mie opere : Flusso correnti nell'impianto fotovoltaico http://arduino.webveneto.net/energy_control/     PING ed E.Mail http://arduino.web

Malo ( VI )
Offline Offline
Sr. Member
****
Karma: 0
Posts: 372
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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  smiley
for o un meccanismo equivalente che faccia 10*10*10.... in base all'esponente
« Last Edit: May 06, 2012, 10:42:09 am by brunol949 » Logged

Le mie opere : Flusso correnti nell'impianto fotovoltaico http://arduino.webveneto.net/energy_control/     PING ed E.Mail http://arduino.web

Offline Offline
Sr. Member
****
Karma: 2
Posts: 397
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 :/
Logged

Pages: [1]   Go Up
Jump to: