|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Aug 2005
Città: Genova
Messaggi: 2285
|
[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...
__________________
Lego ™ Fans Club |
|
|
|
|
|
#2 |
|
Member
Iscritto dal: Apr 2004
Messaggi: 56
|
Vai di double!
|
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Aug 2005
Città: Genova
Messaggi: 2285
|
meglio di no...devo contenere l'occupazione di memoria
Non c'è un modo di troncare alla 2a cifra decimale?
__________________
Lego ™ Fans Club |
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
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.
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me! |
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Aug 2005
Città: Genova
Messaggi: 2285
|
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?
__________________
Lego ™ Fans Club |
|
|
|
|
|
#6 | |
|
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Quote:
Tenendo conto di questo, e a seconda degli scopi (come già sottolineato da PGI) ci sono varie possibilità.
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) |
|
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Aug 2005
Città: Genova
Messaggi: 2285
|
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
__________________
Lego ™ Fans Club |
|
|
|
|
|
#8 |
|
Member
Iscritto dal: Apr 2004
Messaggi: 56
|
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 |
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
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.
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me! |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 12:31.




















