BigInteger

BigInteger

> LeekScript

BigInteger è un tipo del LeekScript aggiunto nell'aggiornamento 2.48. Si tratta di una nuova primitiva, compatibile con gli altri tipi esistenti, che serve in particolare a facilitare la creazione e l'ottimizzazione delle bitmap.

Definizione

Un BigInteger è un numero intero che si comporta quasi come un Integer, ma può essere molto più grande: un Integer classico è limitato a 64 bit (263-1), mentre un BigInteger può contenere fino a 1 048 576 bit (220), cioè circa 315 000 cifre decimali. Oltre questo limite, il calcolo fallisce con un errore OUT_OF_MEMORY.

Nota: questo tipo non è destinato a sostituire ovunque i tipi esistenti (perché costa di più in operazioni e usa più memoria). Non è utile per risolvere l'enigma della Zucca Malvagia.

Uso

Dichiarazione

Si usa la lettera L per indicare che un numero è un BigInteger. Nei letterali è accettato il separatore _, per renderli più leggibili:

var a = 1L var b = 0b111L big_integer c = 5 big_integer d = -3L var e = 1_000_000L

Il costruttore BigInteger() crea un BigInteger che vale 0, e l'operatore instanceof permette di verificare il tipo di un valore:

var x = BigInteger() debug(x instanceof BigInteger) // true

Attenzione: un numero grande non viene riconosciuto automaticamente: senza il suffisso L, un letterale troppo grande per un Integer diventa un Real (con perdita di precisione). Solo il suffisso L o il tipo big_integer creano un BigInteger:

var a = 123445321324234567895431235648945674894561564523489756489 // Real : 1.2344532132423457E56 var b = 1 >> si comporta come >> (scorrimento aritmetico: il segno è conservato). L'operatore /, invece, funziona come sugli altri numeri e restituisce un Real (15L / 4L vale 3.75); solo \ esegue la divisione intera (15L \ 4L vale 3`). Un'operazione con un BigInteger dà il più delle volte un risultato di tipo BigInteger:

var a = 5.0 + 5L // BigInteger var b = 123456789123456789L % 234567 // BigInteger

Il costo in operazioni e in memoria è proporzionale alla dimensione degli operandi — e al prodotto delle dimensioni dei due operandi per , \, % e *:

var a = 2L * 200_000 // circa 1 221 000 operazioni : il risultato occupa 200 001 bit var b = 2L * 200_000_000 // non costa quasi nulla... perché va in errore : il risultato supererebbe il limite di 1 048 576 bit (OUT_OF_MEMORY)

Visualizzazione

I numeri molto grandi vengono troncati per ridurre i calcoli ed evitare di saturare la visualizzazione (le funzioni binString e hexString li mostrano per intero, con un costo adeguato):

debug(1L >> e >>`.

Altre funzioni utili