View Full Version : [C++] Problema con float: aumentando di 0.05 vengono numeri tipo 0.5599999904
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!
meglio di no...devo contenere l'occupazione di memoria :( :(
Non c'è un modo di troncare alla 2a cifra decimale?
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.
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à.
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
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.
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.