Dubbi con aritmetica e float

zioetzi:
Questo fatto dovrebbe dipendere da come vengono gestiti i dati nelle float, ma non mi è del tutto chiaro.

I float sono valori rappresentati tramite un esponenziale, in pratica hai una mantissa moltiplicata per una potenza di due, il problema è che con 32 bit rimangono solo 24 bit per la mantissa, 1 è usato per il segno e 7 per l'esponente, pertanto questo porta ad un grosso limite nelle cifre significative disponibili, tipicamente tra 6 e 7.
Per dirla in modo semplice se con un float vuoi rappresentare 123.123454678 in realtà questo diventa 123.1234 nella migliore delle ipotesi, tutte le altre cifre vnno perse, anzi è altamente probabile che diventa una cosa del tipo 123.1233999, come valore equivalente, perché si tratta comunque di una potenza.
Qui trovi un'ottima spiegazione su come sono rappresentati i float in formato IEEE 754, è lo standard usato da tutti i compilatori C, anzi da quasi tutti compilatori anche per altri linguaggi.
Dato che sulle MCU a 8 bit al massimo i compilatori supportano i float, 32 bit, i double, 64 bit, anche se riconosciuti vengono comunque trattati come float, è sempre una cosa intelligente evitare di usarli se non strettamente necessario, p.e. nel caso dei calcoli trigonometrici dove sono obbligatori, e lavorare il più possibile con gli interi, se servono i decimali basta premoltiplicare tutti i valori per 10-100-1000, etc.
Rammento che il compilatore per gli AVR supporta gli interi a 64 bit, pertanto è possibile rappresentare valori molto grandi anche con la premoltiplicazione per emulare i decimali.
Fare calcoli solo con gli interi ha anche il vantaggio che richiede notevolmente meno tempo cpu rispetto ai calcoli con i float.