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
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
Posta un commento