Go Down

Topic: Errore moltiplicazione (Read 256 times) previous topic - next topic

overflowsystem

Arduino non mi permette di moltiplicare i numeri da 40 in poi per  1000 ad esempio
Code: [Select]
void setup() {
 Serial.begin(9600);
}

void loop() {
   float a = 60 * 1000;
   Serial.print(a);
}


il risultato è -5536 .-. ??? what ??

ho bisogno di effettuare una conversione da secondi a millisecondi, l'unico metodo che conosco è la moltiplicazione per 1000

Teiolass

Dal reference:

Quote
Floating point numbers are not exact, and may yield strange results when compared. For example 6.0 / 3.0 may not equal 2.0.



Ciao
Teiolass
Teiolass

gpb01

No, sei tu che stai sbagliando ...

60 è un intero, 1000 è un intero ... 60 x 1000 = 60000, ma gli interi vanno da -32768 a +32767 quindi prendi 60000, fai il complemento a 2 e ... avrai esattamente -5536  XD

Se vuoi lavorare con i float devi scrivere

Code: [Select]
float a = 60.0 * 1000.0;

... per dirgli che quelli non sono interi ma float !

Guglielmo
Search is Your friend ... or I am Your enemy !

gpb01

@ Teiolass : NON c'entra assolutamente nulla ... cortesemente intervenite quando sapete esattamente di cosa parlate !!!

Guglielmo
Search is Your friend ... or I am Your enemy !

gpb01

@ overflowsystem : comunque scusa ... ma perché vai a disturbare i float che non sono neanche così precisi ???

Usa gli unsigned long (32 bit) che vanno da 0 a 4'294'967'295 ;)

Code: [Select]
unsigned long a = 60 * 1000;

... e passa la paura !  XD

Del resto ... millis() è di tipo unsigned long ... quindi ...  :smiley-roll:

Guglielmo
Search is Your friend ... or I am Your enemy !

PaoloP

Meglio indicare eventualmente UL dopo il numero per forzare la conversione
Code: [Select]
unsigned long a = 60 * 1000UL;

gpb01


Meglio indicare eventualmente UL dopo il numero per forzare la conversione ...


GIUSTO ...
... senza non mi ha mai dato problemi, ma è comunque corretto specificare il tipo di dato quando può essere ambiguo ;)

Guglielmo
Search is Your friend ... or I am Your enemy !

PaoloP

E visto che si parla di una costante un bel
Code: [Select]
const unsigned long ...
sarebbe gradito.  ;)
Cosi il compilatore può ottimizzare meglio il codice.

gpb01


E visto che si parla di una costante ...


Mmm ... non mi pare che overflowsystem parli di costanti ... anzi, sono calcoli dinamici di trasformazione da secondi a millisecondi ...  :smiley-roll:

Guglielmo
Search is Your friend ... or I am Your enemy !

PaoloP

Ok.
Nel caso fosse una costante allora si può ottimizzare il codice.  ;)

nid69ita


Arduino non mi permette di moltiplicare i numeri da 40 in poi per  1000 ad esempio


@overflow, il cross-posting è vietato:
http://forum.arduino.cc/index.php?topic=255595.msg1808296#msg1808296

Ti rispondiamo in italiano o in inglese ?

my name is IGOR, not AIGOR

nid69ita

Ti invitiamo a presentarti (dicci quali conoscenze hai di elettronica e di programmazione) qui: Presentazioni
e a leggere il regolamento: Regolamento
- qui una serie di schede by xxxPighi per i collegamenti elettronici vari: ABC - Arduino Basic Connections
- qui le pinout delle varie schede by xxxPighi: Pinout
- qui una serie di link generali utili: Link Utili
my name is IGOR, not AIGOR

leo72

Qui chiudiamo, continua di là.

Go Up