BigInteger

BigInteger

> LeekScript

BigInteger to typ LeekScriptu dodany w aktualizacji 2.48. Jest to nowy typ prymitywny, zgodny z pozostałymi istniejącymi typami, który służy w szczególności do ułatwienia tworzenia i optymalizacji bitmap.

Definicja

BigInteger to liczba całkowita, która zachowuje się niemal jak Integer, ale może być znacznie większa: klasyczny Integer jest ograniczony do 64 bitów (263-1), a BigInteger może zawierać do 1 048 576 bitów (220), czyli około 315 000 cyfr dziesiętnych. Powyżej tego limitu obliczenie kończy się błędem OUT_OF_MEMORY.

Uwaga: ten typ nie ma zastępować wszędzie istniejących typów (ponieważ kosztuje więcej operacji i zużywa więcej pamięci). Nie przydaje się do rozwiązania zagadki Przeklętej Dyni.

Użycie

Deklaracja

Literą L oznacza się liczbę jako BigInteger. W literałach dozwolony jest separator _, poprawiający czytelność:

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

Konstruktor BigInteger() tworzy BigInteger o wartości 0, a operator instanceof pozwala sprawdzić typ wartości:

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

Uwaga: duża liczba nie jest wykrywana automatycznie: bez przyrostka L literał zbyt duży dla Integer staje się Real (z utratą precyzji). Tylko przyrostek L lub typ big_integer tworzą BigInteger:

var a = 123445321324234567895431235648945674894561564523489756489 // Real : 1.2344532132423457E56 var b = 1 >> zachowuje się jak >> (przesunięcie arytmetyczne: znak jest zachowany). Operator / działa natomiast jak na innych liczbach i zwraca Real (15L / 4L daje 3.75); tylko \ wykonuje dzielenie całkowite (15L \ 4L daje 3`). Operacja z udziałem BigInteger najczęściej daje wynik typu BigInteger:

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

Koszt w operacjach i pamięci jest proporcjonalny do rozmiaru operandów — a dla , \, % i * do iloczynu rozmiarów obu operandów:

var a = 2L * 200_000 // około 1 221 000 operacji: wynik ma 200 001 bitów var b = 2L * 200_000_000 // prawie nic nie kosztuje... bo się wywala: wynik przekroczyłby limit 1 048 576 bitów (OUT_OF_MEMORY)

Wyświetlanie

Bardzo duże liczby są skracane, aby ograniczyć obliczenia i nie zapychać wyświetlania (funkcje binString i hexString wyświetlają je w całości, z odpowiednio dostosowanym kosztem):

debug(1L >> i >>`.

Inne przydatne funkcje