PDA

View Full Version : [C++] Problema con float: aumentando di 0.05 vengono numeri tipo 0.5599999904


Dani88
20-06-2011, 14:28
Come da titolo incrementando/decr un float di 0.05 ogni tanto escono fuori numeri con altri decimali, tipo
0.5599999904
0.3000000301
ecc...
come posso risolvere?? a me servono valori da 0 a 1 ma distanziati di 0.05 esattamente...

zakmckraken
20-06-2011, 15:05
Vai di double!

Dani88
20-06-2011, 15:15
meglio di no...devo contenere l'occupazione di memoria :( :(
Non c'è un modo di troncare alla 2a cifra decimale?

PGI-Bis
20-06-2011, 15:24
E' un problema di rappresentazione a cui non puoi ovviare. Usa un tipo a precisione arbitraria (ci sono un tot di BigDecimal per c++).

Ps.: se ci devi fare dei conti su. Se ti serve il testo, usa una stringa di formato.

Dani88
20-06-2011, 17:15
a me serve che il float abbia solo 2 o max 3 decimali, ma che siano a step di 0.05 o al massimo di 0.005 (devo ancora decidere)...
Non voglio valori intermedi...com'è possibile che se incremento a step di 0.05 vengano fuori quei numeri? :mbe:

banryu79
20-06-2011, 17:29
Non voglio valori intermedi...com'è possibile che se incremento a step di 0.05 vengano fuori quei numeri? :mbe:
Succede a causa del modo in cui vengono rappresentati i numeri razionali su risorse fisiche finite (tra 1.0 e 2.0 ci sono un infinità di valori razionali, così come tra 0.1 e 0.2 e così via...)

Tenendo conto di questo, e a seconda degli scopi (come già sottolineato da PGI) ci sono varie possibilità.

Dani88
20-06-2011, 17:39
si del fatto di infiniti numeri lo so :)
Io sto programmando su un microcontrollore al momento. Quindi devo risparmiare risorse di memoria innanzitutto.
Però mi serve anche quanto sopra descritto :(

zakmckraken
20-06-2011, 19:19
Ciao!
In un caso analogo, in ambito embedded avevo utilizzato delle union per rappresentare in forma frazionaria il tutto (per motivi di irrealizzabilita'del testing del processore non potevo usare la FPU...sigh) con le relative funzioni per gestire le varie operazioni.
Zak

PGI-Bis
20-06-2011, 19:19
Risparmio e precisione non vanno d'accordo ma se proprio non puoi farne a meno allora potresti usare la quantizzazione. Di solito serve per comprimere valori reali in un range predefinito ma una sua specie potrebbe fare al caso tuo.

Al posto dei float usi degli int (secondo il range potrebbe bastarti uno short o anche un byte e uno short/int). Rappresenti la parte frazionaria usando una parte del numero intero.

Se usi come "quantizzatore" la divisione intera per 100 allora i tuoi interi rappresenterebbero, ad esempio:

0 = 0
5 = 0.05
10 = 0.1
15 = 0.15
105 = 1.05

il passaggio float -> int è la conversione ad int dell'arrotondamento del float diviso 100

float_to_int = (int)(round(valoreFloat* 100))

il passaggio int -> float è la conversione a float del valore divisa per cento

int_to_float = ((float)valoreInt) / 100f;

Tuttavia, se devi fare conti precisi, l'unica sono i big decimal - che usano tecniche analoghe ma su stringhe illimitate di bit.