Floating point numbers in JAVA

INTRODUZIONE

Tutti noi sviluppatori alla parola "numeri a virgola mobile" sentiamo un brivido percorrere la schiena. Ricordi lontani di giorni passati in università per capire come mai dovessimo imparare quelle assurdità... eh invece! Ci sbagliavamo!

Andiamo con ordine...

Più specificamente un numero a virgola mobile a doppia precisione è composto da 64 bit come segue:
  • 1 bit per il segno (positivo o negativo)
  • 11 bit per indicare l'esponente
  • 52 bit per indicare la parte significativa del dato
L'unione di queste parti rappresenteranno il valore.

PROBLEMA

A differenza di tipi come byte char int long che sono rappresentati da una lunghezza fissa di bit (quindi molto precisi), i numeri rappresentati mediante virgola mobile double e float possono sbagliare i calcoli per il semplice fatto che non possono precisamente rappresentare l'esatto valore di un numero ma andarci molto vicino.

Questo è il motivo per cui se sommiamo due double del valore di 0.1 e 0.2 il risultato non è 0.3


Risultato: 0.30000000000000004

La rappresentazione in virgola mobile  è usata perché, rispetto alla notazione in virgola fissa, estende  l’intervallo di numeri rappresentati a parità di cifre.

SOLUZIONE

La soluzione banale è  la seguente, se si vogliono effettuare delle operazioni aritmetiche con la giusta precisione occorre usare necessariamente un tipo numerico a lunghezza fissa di bit.

Sempre in java esiste la classe java.lang.BigDecimal che è in grado di supportare operazioni aritmetiche con numeri molto grandi e numeri molto piccoli. Il problema è che questa classe non supporta le operazioni primitive ( + - × / ) ma occorre utilizzare apposite funzioni.


Commenti

Post popolari in questo blog

Hadoop, how to create a single node cluster using docker

How to install IOTA node with docker

Apache Spark - Try it using docker!