Каково максимальное значение числа в Lua? - PullRequest
18 голосов
/ 03 июня 2009

В документации нет четкого ответа на этот вопрос.

Я заинтересован в увеличении переменной time, которая считает секунды с момента запуска программы. Если максимальное значение может рассчитывать далеко в будущее, например, на 100 лет, тогда мне наплевать на постоянное увеличение переменной. В противном случае мне придется подумать о хорошей точке сброса time обратно в 0.

Ответы [ 5 ]

25 голосов
/ 03 июня 2009

как скомпилировано по умолчанию, Number является double, на большинстве компиляторов это 64-битная IEEE с плавающей запятой. это означает 10-битный показатель, поэтому максимальное число составляет примерно 2 ^ 1024, или 5,6–300 лет. это долго.

Теперь, если вы увеличиваете его, возможно, вас больше заинтересует целочисленный диапазон. 52-битная мантисса означает, что наибольшее число, которое можно использовать с целочисленной точностью, составляет 2 ^ 52, около 4.5e15. На 31 557 600 секунд в год, это 1,427e8, почти 150 миллионов лет. все еще очень долгое время безотказной работы для любого процесса

обновление 2014-12-30 : Lua 5.3 (будет выпущен в любой момент) добавляет поддержку целочисленных значений, 32 или 64 бита, выбранных с помощью флагов компиляции.

8 голосов
/ 04 июня 2009

Хотя ссылка Тыдока на PiL 2.3 правильна и уместна, а Ответ Хавьера на практике верен, я думал, что обсуждение чисел в Lua следует округлить парой других деталей.

Интерпретатор Lua предназначен для встраивания в приложение, как правило, в качестве языка конфигурации и / или сценариев. При сборке для приложения обычно настраивают некоторые его функции в соответствии с требованиями.

Точный числовой тип для чисел доступен для конфигурации. При компиляции для платформы без аппаратной плавающей запятой, где загрузка сторонних модулей не важна (особенно во встроенной системе или приложении игровой консоли приставки), тогда разумно выбрать целочисленный тип вместо значения по умолчанию double. Иногда разумно также перейти на float.

Однако, есть приложения, где нужны 64-битные целые числа, или большинство чисел могут быть целыми числами, но иногда требуется арифметика с плавающей запятой. Для этих случаев есть ядро ​​ LNUM для ядра Lua.

LNUM изменяет ядро ​​так, что числа хранятся в виде целых чисел или с плавающей запятой, и позволяет несколько настраиваемых выборов для точности каждого.

Таким образом, нижняя строка ответа на вопрос о максимальном значении числа Lua заключается в том, что это зависит от конфигурации интерпретатора, выбранного во время компиляции, и от того, беспокоитесь ли вы о представляемой максимальной величине или максимальном целом числе. И даже тогда была проделана работа, чтобы большие целые числа хорошо играли с представлениями с плавающей запятой.

1 голос
/ 08 мая 2018

Это самое высокое значение, упомянутое в нескольких других ответах. Вот откуда взялся 1.8e308:

local HighestNumber = 0
for i = 971, 1023 do
    HighestNumber = HighestNumber + (2 ^ i)
end

У меня недостаточно репутации для публикации изображений, но, очевидно, это можно выразить как сигма-сумму.

0 голосов
/ 07 декабря 2016

Использование Lua5.1 или Lua5.2

Максимальное отформатированное число:

179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368

Если вы измените 68 на 69 в конце, он все равно покажет только 68. Число, превышающее указанное выше, возвращает math.huge aka inf.

Что равно: 1,8x10 ^ 308 или чуть южнее 2 ^ 1024.

Попробуйте сами:

print(string.format("%.0f",number))
0 голосов
/ 03 июня 2009

Я нашел это письмо на сайте пользователей lua

Ядро Lua не использует 64-битные типы данных, кроме как неявно через size_t или ptrdiff_t (что в 64-битном боксе 64-битное).

sizeof (float) == 4
sizeof (double) == 8

Вы можете определить lua_Number как двойное (по умолчанию), число с плавающей запятой или любое целое число как минимум с 32 битами. Есть побочные эффекты, хотя и некоторые расширения может перестать работать из-за ограниченного диапазона поплавков или целых. Ядро должно быть хорошо, хотя.

...