calcoli che non tornano...

Ciao a Tutti,

allora sto scrivendo uno sketch dove uso una serie di #define ed in alcuni di questi non mi tornano i conti...i #define sono:

#define SPIRA1 30.0 // da 0 a 30
#define SPIRA2 SPIRA1+35.0 // da 30 a 65
#define SPIRA3 SPIRA2+45.0 // da 65 a 110
#define SPIRA4 SPIRA3+50.0 // da 110 a 160

#define IMP1M 10.0 //impulsi METRO da 0 a 30
#define IMP2M 9.0 //impulsi METRO da 30 a 65
#define IMP3M 8.0 //impulsi METRO da 65 a 110
#define IMP4M 7.0 //impulsi METRO da 110 a 160

#define IMP1 SPIRA1*IMP1M //impulsi TOTALI da 0 a 30
#define IMP2 (IMP1+((SPIRA2 - SPIRA1)*IMP2M)) //impulsi TOTALI da 0 a 65
#define IMP3 (IMP2+((SPIRA3 - SPIRA2)*IMP3M))  //impulsi TOTALI da 0 a 110
#define IMP4 (IMP3+((SPIRA4 - SPIRA3)*IMP4M)) //impulsi TOTALI da 0 a 160

in pratica gli ultimi 2 #define non eseguono il calcolo giusto...in teoria dovrebbe essere:
IMP3=(IMP2+((110.0 - 65.0)*IMP3M)) ... ecco quel 110.0-65.0 mi ritorna 115.0???
stesso problema ce l'ho con l'ultimo #define...con quelli prima tutto ok...come mai?

se li scrivo direttamente in "numero", cioè 110.0 - 65.0 tutto ok...ho già controllato i valori di SPIRA1-2-3-4 e sono corretti.
cosa sbaglio?

allora...sembra risolto eliminando il #define e dichiarando la variabile come const float...ma perchè questo errore?...qualcuno può darmi una spiegazione!?
grazie

Visto che sei uno bravo, ti do la soluzione e tu ti reverse-engineeri il problema ;).

#define IMP3 ((IMP2)+(((SPIRA3) - (SPIRA2))*(IMP3M)))

wow...grazie SukkoPera,

penso di aver capito...adesso non so cosa il compilatore fa esattamente con quello che ho scritto ma in definitiva il problema, o meglio il mio errore, si può semplificare con questo esempio :

#define MOLTIPLICA(a,b) a*b

int main()
{int a=5,b=3,c;

c = MOLTIPLICA(a,b); // tutto OK ! diventa c = a * b;

c = MOLTIPLICA( a + b, b ); // ?? diventa c = a + b * b;

return 0; }

Per ovviare al problema basta inserire delle parentesi ...

#define MOLTIPLICA(a,b) (a) * (b)

Il problema è che le macro (i #define) vengono sostituiti in maniera testuale, esattamente come se facessi trova/sostituisci in un editor di testo. Per cui, nel tuo caso -SPIRA2 diventa -SPIRA1+35.0, mentre matematicamente dovrebbe diventare -SPIRA1-35.0. Con le parentesi tutto fila invece liscio.

perfetto!...grazie ancora.

+1