Go Down

Topic: funzione pow - elevamento a potenza (Read 487 times) previous topic - next topic

lromagnoli23

strano comportamento di questo sketch potete provarlo?

void setup() {                
 Serial.begin(9600);
 int i=0;  
 while (i < 100){
   Serial.print(i);
   Serial.print(" - ");
   Serial.println(pow(2,i));
   i++;
 }
}

void loop() {
}


l'output è il seguente


0 - 1.00
1 - 2.00
2 - 4.00
3 - 8.00
4 - 16.00
5 - 32.00
6 - 64.00
7 - 128.00
8 - 256.00
9 - 512.00
10 - 1024.00
11 - 2048.00
12 - 4096.00
13 - 8192.00
14 - 16383.99
15 - 32767.98
16 - 65535.95
17 - 131072.00
18 - 262143.65
19 - 524287.31
20 - 1048574.62
21 - 2097152.00
22 - 4194298.50
23 - 8388597.00
24 - 16777194.00
25 - 33554432.00
26 - 67108864.00
27 - 134217552.00
28 - 268435104.00
29 - 536870912.00
30 - 1073740416.00
31 - 2147480832.00
32 - 4294961664.00
33 - 0.00

ok che il 33 è in overflow ma il valore 14 non è un pò strano?  :smiley-roll-sweat:

astrobeed


strano comportamento di questo sketch potete provarlo?


La risposta è nel fatto che pow è definita come pow(float,float), il che ci porta ai soliti problemi di arrotondamento con questo tipo di calcoli e alla scarsa risoluzione su i decimali tipica dei valori float a 32 bit.

lromagnoli23

lo capirei se avessi usato dei valori decimali e dovrebbe usare dei double almeno secondo il mio math.h
ma non vengono mai introdotti i decimali è semplicemente 256*256

extern double pow(double __x, double __y) __ATTR_CONST__;

http://www.arduino.cc/en/Math/H
http://www.nongnu.org/avr-libc/user-manual/group__avr__math.html

ho provato il codice in un qualsiasi altro compilatore c++ (avrei dovuto farlo in c lo so ...) e non da alcun problema di arrotondamento

è una caratteristica o un problema del mondo arduino, lo chiedo per sapere a cosa devo stare attendo nel programmare in questa piattaforma
funzione cpp

int test()
{
    int i=0; 
    while (i < 100){
        cout << i << " - " << pow(2,i) << endl;;
        i++;
    }
}   




astrobeed


extern double pow(double __x, double __y) __ATTR_CONST__;


Double è sinonimo di float, anzi indicherebbe un float con doppia precisione che però su Arduino non esiste, non è un intero.
Se ti vai a vedere il reference della pow puoi vedere da solo che base ed esponente sono definiti come float e non come interi.


Go Up
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy