BigInteger

BigInteger

> LeekScript

BigInteger es un tipo de LeekScript añadido en la actualización 2.48. Se trata de una nueva primitiva compatible con los demás tipos existentes, que sirve sobre todo para facilitar la creación y la optimización de bitmaps.

Definición

Un BigInteger es un número entero que se comporta casi como un Integer, pero puede ser mucho más grande: un Integer clásico está limitado a 64 bits (263-1), mientras que un BigInteger puede contener hasta 1 048 576 bits (220), es decir, unos 315 000 dígitos decimales. Más allá de ese límite, el cálculo falla con un error OUT_OF_MEMORY.

Nota: Este tipo no pretende sustituir en todas partes a los tipos existentes (ya que cuesta más en operaciones y usa más memoria). No sirve para resolver el enigma de la Calabaza Maléfica.

Uso

Declaración

Se usa la letra L para designar un número como BigInteger. El separador _ se acepta en los literales para hacerlos más legibles:

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

El constructor BigInteger() crea un BigInteger que vale 0, y el operador instanceof permite comprobar el tipo de un valor:

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

Atención, un número grande no se detecta automáticamente: sin el sufijo L, un literal demasiado grande para un Integer se convierte en un Real (con pérdida de precisión). Solo el sufijo L o el tipo big_integer crean un BigInteger:

var a = 123445321324234567895431235648945674894561564523489756489 // Real : 1.2344532132423457E56 var b = 1 >> se comporta como >> (desplazamiento aritmético: se conserva el signo). El operador /, por su parte, funciona como en los demás números y devuelve un Real (15L / 4L vale 3.75); solo \ realiza la división entera (15L \ 4L vale 3`). Una operación con un BigInteger da la mayoría de las veces un resultado de tipo BigInteger:

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

El coste en operaciones y en memoria es proporcional al tamaño de los operandos, y al producto de los tamaños de los dos operandos para , \, % y *:

var a = 2L * 200_000 // unas 1 221 000 operaciones: el resultado ocupa 200 001 bits var b = 2L * 200_000_000 // casi no cuesta nada... porque falla: el resultado superaría el límite de 1 048 576 bits (OUT_OF_MEMORY)

Visualización

Los números muy grandes se recortan para reducir los cálculos y evitar saturar la pantalla (las funciones binString y hexString los muestran enteros con un coste ajustado):

debug(1L >> y >>`.

Otras funciones útiles