Alcune volte sì. Non è una cosa che capita con tutti i numeri, ma alcuni numeri decimali non è possibile (in base 2) rappresentarli con esattezza. Il sistema numerico in base 2 è un sistema posizionale come anche quello in base 10; ciò significa che ogni cifra di un numero ha un suo "peso" che è dato dalla posizione. Ad esempio, il numero 123 è uguale a (1·100) + (2·10) + (3·1), dove tutti i moltiplicatori sono potenze di 10. I numeri decimali seguono lo stesso principio: 0,53 = (5 / 10) + (3 / 100), dove i moltiplicatori sono le potenze negative di 10.
Un numero in base 2 ha semplicemente una base diversa, il procedimento invece è identico: 7 in base 10 = 111 in base 2 = (1·4) + (1·2) + (1·1). Invece: 0,25 in base 10 = 0,01 in base 2 = (0 / 2) + (1 / 4).
L'algoritmo per convertire un numero decimale dalla base 10 alla base 2 è semplice: lo moltiplichi per due; del risultato, la parte a sinistra della virgola è il "bit" della conversione, la parte a destra della virgola va presa da sola e vi va riapplicato il procedimento (finché non ottieni 0).
Prendiamo 0,2 in base 10 e convertiamolo in base 2:
Codice:
0,2 · 2 = 0,4 | primo bit: 0
0,4 · 2 = 0,8 | secondo bit: 0
0,8 · 2 = 1,6 | terzo bit: 1
0,6 · 2 = 1,2 | quarto bit: 1
0,2 · 2 = ......
Come vedi si è ritornati a 0,2, e il procedimento ripeterà periodicamente quei 4 bit, dando vita ad una serie infinita di cifre dopo la virgola.
Per sicurezza ho chiesto anche a Qalculate!, che mi traduce 0,2 in base 10 in questa stringa binaria:
Codice:
≈ 0.0011001100110011001100110011
Segnalandomi, come vedi, l'approssimazione (è una sequenza troncata).
Il problema coi float è che usano la precisione singola su 32 bit (1 di segno, 8 di esponente, e
solo 23 di mantissa), quindi, approssimazione dopo approssimazione, con centinaia e centinaia di somme ottieni risultati imprecisi. Con la precisione doppia già puoi avere risultati più affidabili.
Poi, ovvio che software complessi che devono garantire una buona dose di precisione facciano fronte a questi problemi in diversi modi... Insomma, non è tutto da gettare alle ortiche, tranquillo.