BigInteger

BigInteger

> LeekScript

BigInteger é um tipo do LeekScript adicionado na atualização 2.48. Trata-se de uma nova primitiva compatível com os outros tipos existentes, que serve principalmente para facilitar a criação e a otimização dos bitmaps.

Definição

Um BigInteger é um número inteiro que se comporta quase como um Integer, mas pode ser bem maior: um Integer clássico é limitado a 64 bits (263-1), enquanto um BigInteger pode conter até 1 048 576 bits (220), ou seja, cerca de 315 000 algarismos decimais. Acima desse teto, o cálculo falha com um erro OUT_OF_MEMORY.

Nota: esse tipo não tem a vocação de substituir os tipos existentes em todo lugar (pois custa mais caro em operações e usa mais memória). Ele não é útil para resolver o enigma da Abóbora maligna.

Uso

Declaração

Usa-se a letra L para designar um número como BigInteger. O separador _ é aceito nos literais para torná-los mais legíveis:

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

O construtor BigInteger() cria um BigInteger valendo 0, e o operador instanceof permite testar o tipo de um valor:

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

Atenção: um número grande não é detectado automaticamente. Sem o sufixo L, um literal grande demais para um Integer vira um Real (com perda de precisão). Apenas o sufixo L ou o tipo big_integer criam um BigInteger:

var a = 123445321324234567895431235648945674894561564523489756489 // Real : 1.2344532132423457E56 var b = 1 >> se comporta como >> (deslocamento aritmético: o sinal é conservado). O operador /, por sua vez, funciona como nos outros números e retorna um Real (15L / 4L vale 3.75); apenas \ efetua a divisão inteira (15L \ 4L vale 3`). Uma operação com um BigInteger dá, na maioria das vezes, um resultado de tipo BigInteger:

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

O custo em operações e em memória é proporcional ao tamanho dos operandos — e ao produto dos tamanhos dos dois operandos para , \, % e *:

var a = 2L * 200_000 // cerca de 1 221 000 operações: o resultado tem 200 001 bits var b = 2L * 200_000_000 // quase não custa nada... porque dá erro: o resultado ultrapassaria o teto de 1 048 576 bits (OUT_OF_MEMORY)

Exibição

Os números muito grandes são cortados para reduzir os cálculos e evitar saturar a exibição (as funções binString e hexString os mostram por inteiro, com um custo ajustado):

debug(1L >> e >>`.

Outras funções úteis