Rappresentare numeri grandissimi

DOMANDA:

E' possibile rappresentare in Java dei numeri grandissimi che hanno un valore oltre quello consentito dai tipi di dati primitivi long e int?


RISPOSTA:

Come abbiamo visto nel post sul range di valori rappresentabili con i diversi tipi di dati primitivi, effettuare un'operazione il cui risultato vada oltre tale limite comporta un errore di calcolo con conseguenze potenzialmente disastrose.

La soluzione a tali limitazioni esiste: la prima, più complessa, rientra nell'analisi numerica e in algoritmi di troncamento, arrotondamento e bit shifting, ma non è scopo di questo post.
La seconda invece è messa a disposizione da Java con le classi java.math.BigInteger e java.math.BigDecimal (rispettivamente per i numeri interi e decimali).

Guardiamo con un esempio come funzionano:
package bignumbers;

import java.math.BigInteger;

public class BigNumbers {
  public static void main(String[] args) {

    // rappresentazione errata oltre i limiti
    long primo = 9999999999999L;
    long secondo = 9999999999999L;
    long risultato = primo * secondo;
    System.out.println("Risultato primo * secondo = " + risultato);

    // rappresentazione corretta
    BigInteger bigPrimo = new BigInteger("9999999999999");
    BigInteger bigSecondo = new BigInteger("9999999999999");
    BigInteger bigRisultato = bigPrimo.multiply(bigSecondo); 
    System.out.println("Risultato bigPrimo * bigSecondo = " + bigRisultato);
  }
}
L'output sarà:
Risultato primo * secondo = -2537784290115403775
Risultato bigPrimo * bigSecondo = 99999999999980000000000001

Come si può vedere, nel primo caso abbiamo avuto un risultato errato dovuto al superamento dei limiti rappresentabili dal tipo di dato long. Nel secondo, gli algoritmi della classe BigInteger ci hanno permesso di superare il range rappresentabile e stampare il risultato corretto.

La classe BigInteger, così come la classe BigDecimal, non ha limiti ben definiti come i tipi di dati primitivi, ma dipende dalla dotazione hardware del calcolatore.

Queste classi forniscono anche altri metodi per effettuare le diverse operazioni aritmetiche e anche quelle logiche (come ad esempio il confronto). Per ulteriori approfondimenti vi rimando alla documentazione ufficiale.


Commenti

Post popolari in questo blog

Arrotondamento e troncamento in Java

Eclipse: Shortcuts (scorciatoie) da tastiera

Strutture dati: List, Set, Map

Creare un eseguibile Java