Pages: [1]   Go Down
Author Topic: Errore moltiplicazione  (Read 209 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 5
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Arduino non mi permette di moltiplicare i numeri da 40 in poi per  1000 ad esempio
Code:
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
Logged

Torino
Offline Offline
Newbie
*
Karma: 1
Posts: 31
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Teiolass

Switzerland
Offline Offline
Faraday Member
**
Karma: 114
Posts: 5989
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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  smiley-lol

Se vuoi lavorare con i float devi scrivere

Code:
float a = 60.0 * 1000.0;

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

Guglielmo
Logged

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

Switzerland
Offline Offline
Faraday Member
**
Karma: 114
Posts: 5989
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Guglielmo
Logged

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

Switzerland
Offline Offline
Faraday Member
**
Karma: 114
Posts: 5989
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

@ 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 smiley-wink

Code:
unsigned long a = 60 * 1000;

... e passa la paura !  smiley-lol

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

Guglielmo
Logged

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

Cagliari, Italy
Offline Offline
Tesla Member
***
Karma: 114
Posts: 7205
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

Switzerland
Offline Offline
Faraday Member
**
Karma: 114
Posts: 5989
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 smiley-wink

Guglielmo
Logged

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

Cagliari, Italy
Offline Offline
Tesla Member
***
Karma: 114
Posts: 7205
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

E visto che si parla di una costante un bel
Code:
const unsigned long ...
sarebbe gradito.  smiley-wink
Cosi il compilatore può ottimizzare meglio il codice.
Logged

Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

Switzerland
Offline Offline
Faraday Member
**
Karma: 114
Posts: 5989
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

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

Cagliari, Italy
Offline Offline
Tesla Member
***
Karma: 114
Posts: 7205
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ok.
Nel caso fosse una costante allora si può ottimizzare il codice.  smiley-wink
Logged

Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

ivrea (to)
Offline Offline
Faraday Member
**
Karma: 87
Posts: 5017
miaaao ^-^
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 ?

Logged

my name is IGOR, not AIGOR

ivrea (to)
Offline Offline
Faraday Member
**
Karma: 87
Posts: 5017
miaaao ^-^
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

my name is IGOR, not AIGOR

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

Qui chiudiamo, continua di là.
Logged


Pages: [1]   Go Up
Jump to: