BigInteger

BigInteger

> LeekScript

BigInteger — это тип LeekScript, добавленный в обновлении 2.48. Это новый примитив, совместимый с другими существующими типами; он служит, в частности, для упрощения создания и оптимизации битовых карт.

Определение

BigInteger — это целое число, которое ведёт себя почти как Integer, но может быть гораздо больше: обычный Integer ограничен 64 битами (263-1), а BigInteger может содержать до 1 048 576 бит (220), то есть около 315 000 десятичных цифр. При превышении этого предела вычисление завершается ошибкой OUT_OF_MEMORY.

Примечание: этот тип не предназначен для повсеместной замены существующих типов (он дороже по операциям и использует больше оперативной памяти). Он не поможет решить загадку Зловещей тыквы.

Использование

Объявление

Для обозначения числа как BigInteger используется буква L. В литералах допускается разделитель _ для удобства чтения:

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

Конструктор BigInteger() создаёт BigInteger, равный 0, а оператор instanceof позволяет проверить тип значения:

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

Внимание: большое число не распознаётся автоматически. Без суффикса L литерал, слишком большой для Integer, становится Real (с потерей точности). Только суффикс L или тип big_integer создают BigInteger:

var a = 123445321324234567895431235648945674894561564523489756489 // Real : 1.2344532132423457E56 var b = 1 >> ведёт себя как >> (арифметический сдвиг: знак сохраняется). Оператор / работает так же, как и для остальных чисел, и возвращает Real (15L / 4L равно 3.75); только \ выполняет целочисленное деление (15L \ 4L равно 3`). Операция с BigInteger чаще всего даёт результат типа BigInteger:

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

Стоимость в операциях и памяти пропорциональна размеру операндов — а для , \, % и * произведению размеров двух операндов:

var a = 2L * 200_000 // около 1 221 000 операций: результат занимает 200 001 бит var b = 2L * 200_000_000 // почти ничего не стоит... потому что падает: результат превысил бы предел в 1 048 576 бит (OUT_OF_MEMORY)

Отображение

Очень большие числа обрезаются, чтобы сократить вычисления и не перегружать вывод (функции binString и hexString выводят их целиком, с соответствующей стоимостью):

debug(1L >> и >>`.

Другие полезные функции