arrotondamento funzione MAP

Ciao a tutti,
la questione è banale: sto usando la funzione map e vorrei sapere cosa accade quando il risultato matematico della sua espressione (presente anche sul sito) è un numero reale tipo 1.6.

MAP arrotonda per eccesso e quindi restituisce 2?

Io vorrei che restituisca sempre 1 finchè il risultato non diventa >2.

Quindi così: da 0 a 0.9 > 0. da 1 a 1.9 > 1. da 2 a 2.9 > 2 e così via

Grazie in anticipo :slight_smile:

Se guardi il codice della map, lei utilizza numeri long, quindi tutti i decimali nel risultato sono troncati

Arduino.h e WMath.cpp
long map(long x, long in_min, long in_max, long out_min, long out_max)
{ return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}

Infatti..........non parlo dei numeri in ingresso alla funzione, ma quello che restituisce!

In ingresso i miei numeri sono tutti int, ma il risultato matematico può essere anche un float!

Quindi, come ottenere ciò che vorrei?
cioè che quando il risultato è 1.5 in realtà vorrei che fosse 1, quando il risultato è 2.1 vorrei che fosse 2 ecc ecc

Se la map restituisce un long (quindi numero senza virgole) come pensi di ottenere delle virgole ?

Non ci siamo capiti. Il risultato interno della funzione, eseguito su valori long, ti può dare un float concettualmente.
Ovviamente map restituisce un long, quindi fa il cast?

ekjk:
Ovviamente map restituisce un long, quindi fa il cast?

Ovviamente.
E quindi se fa cast da reale a intero, tronca i decimali

Premetto che non sono troppo pratico di questi aspetti del C/C++, ma secondo me non c'è nessun cast e nessuna conversione di tipo. L'unica operazione che può dare origine a un valore decimale è la divisione, ma questa viene eseguita tra due operandi il cui tipo è intero (long), quindi viene semplicemente eseguita una divisione intera, scartando il resto insomma.