Pages: [1]   Go Down
Author Topic: funzione pow - elevamento a potenza  (Read 410 times)
0 Members and 1 Guest are viewing this topic.
Ancona
Offline Offline
Newbie
*
Karma: 0
Posts: 38
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Rome (Italy)
Offline Offline
Tesla Member
***
Karma: 138
Posts: 9887
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Ancona
Offline Offline
Newbie
*
Karma: 0
Posts: 38
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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++;
    }
}   



Logged

Rome (Italy)
Offline Offline
Tesla Member
***
Karma: 138
Posts: 9887
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.

Logged

Pages: [1]   Go Up
Jump to: