2009-06-03 54 views
12

No parece haber una respuesta clara a esto en la documentación.¿Cuál es el valor máximo de un número en Lua?

Estoy interesado en incrementar una variable time que cuenta los segundos desde que se inició el programa. Si el valor máximo puede contar muy lejos en el futuro, como 100 años, entonces no me importa dejar que la variable se incremente para siempre. De lo contrario voy a tener que pensar en un buen punto para restablecer time de nuevo a 0.

Respuesta

19

compilados de manera predeterminada, el número es double, en la mayoría de los compiladores es un punto flotante IEEE de 64 bits. eso significa exponente de 10 bits, por lo que el número máximo es aproximadamente 2^1024, o 5.6e300 años. Eso es un largo tiempo.

ahora, si lo está incrementando, es posible que esté más interesado en el rango entero. la mantisa de 52 bits significa que el número más alto que se puede usar con precisión entera es 2^52, alrededor de 4.5e15. En 31'557,600 segundos/año, eso es 1.427e8, casi 150 millones de años. aún un tiempo de actividad muy largo para cualquier proceso

update 2014-12-30: Lua 5.3 (que se lanzará en cualquier momento) agrega soporte para valores enteros, 32 o 64 bits elegidos mediante indicadores de compilación.

+19

Gracias, lo puede soportar ser odiado por unos pocos programadores 150 millones de años a partir de ahora. – Kai

+3

Por cierto, aunque es una mantisa de 52 bits, hay un poco implícito de precisión "adicional", por lo que lo más alto que puede aumentar en uno es alrededor de 2^53. – Eloff

+0

2^53 * es * el primer número que no aumentará. Esto se debe a que la mantisa IEEE-754 tiene un bit "oculto" más significativo que se supone que es 1 si el exponente no es cero y no es el máximo exponente. Cuando el valor es 2^53, solo se establece ese bit oculto, y el bit menos significativo no se almacena, pero su valor es cero, por lo que el valor sigue siendo exactamente correcto. Incrementar ese valor incrementa ese bit que no está almacenado, por lo que no hay efecto en el resultado. Tenga en cuenta que se pueden almacenar valores más altos, pero solo se almacenarán los 53 bits más altos, los bits más bajos se pondrán a cero. – doug65536

0

encontré this email en el sitio los usuarios lua

El núcleo Lua no hace uso de 64 tipos de datos de bits, excepto implícitamente a través de size_t o ptrdiff_t (que resultan ser de 64 bits en una caja de 64 bits).

sizeof (float) == 4
sizeof (doble) == 8

Se puede definir lua_Number a ser un doble (por defecto), flotador o cualquier número entero con al menos 32 bits. Sin embargo, existen efectos secundarios y algunas extensiones pueden dejar de funcionar debido a la limitada gama de flotadores o ints. El núcleo debería estar bien, sin embargo.

7

Aunque la referencia de tydok a PiL 2.3 es correcta y apropiada, y Javier's answer es en la práctica correcta, pensé que la discusión de los números en Lua debería completarse con un par de detalles más.

El intérprete Lua está diseñado para integrarse en una aplicación típicamente como una configuración y/o lenguaje de scripting. Cuando se crea para una aplicación, es común configurar algunas de sus características para que se adapten.

El tipo numérico exacto que se utilizará para los números está disponible para la configuración. Al compilar para una plataforma sin hardware punto flotante donde cargar módulos de terceros no es importante (especialmente en un sistema integrado o aplicación de consola de juegos decodificadores), entonces es razonable elegir un tipo integral en lugar del double predeterminado. Ocasionalmente, también es razonable cambiar a float.

Sin embargo, hay aplicaciones en las que se necesitan enteros de 64 bits, o la mayoría de los números pueden ser enteros, pero se requiere aritmética de punto flotante ocasional. Para esos casos, está el LNUM patch en el núcleo de Lua.

LNUM cambia el núcleo para que los números se almacenen como enteros o coma flotante, y permite varias selecciones configurables para la precisión de cada uno.

Por lo tanto, la respuesta final a la pregunta del valor máximo de un número Lua es que depende de la configuración del intérprete elegido en tiempo de compilación, y si le preocupa la magnitud máxima representable o el entero máximo. E incluso entonces, se ha trabajado para que los enteros grandes funcionen bien con las representaciones de coma flotante.

+3

LNUM es excelente, tanto para la velocidad en procesadores que no son FPU (algunos ARM van allí), y para esas raras ocasiones realmente necesitas matemáticas de números enteros de 64 bits. – Javier

0

Usando Lua5.1 o Lua5.2

máximo número formateado:

179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368 

Si cambia de 68 a 69 el final todavía sólo muestra 68. un número mayor que el número anterior devuelve math.huge aka inf.

Que es igual a: 1.8x10^308 o al sur de 2^1024.

Pruebe usted mismo:

print(string.format("%.0f",number)) 
Cuestiones relacionadas