Каково максимальное значение числа в Lua?
В документации нет четкого ответа на этот вопрос.
Я заинтересован в увеличении переменной time
отсчитывает секунды с момента запуска программы. Если максимальное значение может рассчитывать далеко в будущее, например, на 100 лет, тогда мне наплевать на приращение переменной навсегда. В противном случае мне придется подумать о хорошей точке для сброса time
вернуться к 0.
7 ответов
Как скомпилировано по умолчанию, число является double
на большинстве компиляторов это 64-битная IEEE с плавающей запятой. это означает 10-битный показатель, поэтому максимальное число составляет примерно 2 ^ 1024, или 5,6e300 лет. это долго.
теперь, если вы увеличиваете его, вы можете быть более заинтересованы в целочисленном диапазоне. 52-битная мантисса означает, что наибольшее число, которое можно использовать с целочисленной точностью, составляет 2 ^ 52, около 4.5e15. На 31 557 600 секунд в год, это 1,427e8, почти 150 миллионов лет. все еще очень долгое время безотказной работы для любого процесса
обновление 2014-12-30: Lua 5.3 (будет выпущен в любой момент) добавляет поддержку целочисленных значений, 32 или 64 бита, выбранных с помощью флагов компиляции.
Хотя ссылка Тыдока на PiL 2.3 и правильная, и правильная, а ответ Хавьера на практике верный, я подумал, что обсуждение чисел в Lua следует завершить парой других деталей.
Интерпретатор Lua предназначен для встраивания в приложение, как правило, в качестве языка конфигурации и / или сценариев. При сборке для приложения обычно настраивают некоторые его функции в соответствии с требованиями.
Точный числовой тип для чисел доступен для конфигурации. При компиляции для платформы без аппаратной плавающей запятой, где загрузка сторонних модулей не важна (особенно во встроенной системе или приложении игровой консоли приставки), тогда разумно выбрать целочисленный тип вместо значения по умолчанию double
, Иногда, переключаясь на float
разумно также.
Однако есть приложения, где нужны 64-битные целые числа, или большинство чисел могут быть целыми числами, но иногда требуется арифметика с плавающей запятой. Для этих случаев есть ядро LNUM для ядра Lua.
LNUM изменяет ядро так, что числа хранятся в виде целых чисел или с плавающей запятой, и позволяет несколько настраиваемых выборов для точности каждого.
Таким образом, нижняя строка ответа на вопрос о максимальном значении числа Lua состоит в том, что это зависит от конфигурации интерпретатора, выбранного во время компиляции, и от того, беспокоитесь ли вы о представляемой максимальной величине или максимальном целом числе. И даже тогда была проделана работа, чтобы большие целые числа хорошо играли с представлениями с плавающей запятой.
Это самое высокое значение, упомянутое в нескольких других ответах. Вот откуда взялся 1.8e308:
local HighestNumber = 0
for i = 971, 1023 do
HighestNumber = HighestNumber + (2 ^ i)
end
У меня недостаточно репутации для публикации изображений, но, очевидно, это можно выразить как сигма-сумму.
Использование Lua5.1 или Lua5.2
Максимальное форматированное число:
179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368
Если вы измените значение 68 на 69 в конце, оно по-прежнему будет отображать только 68. Число, превышающее указанное выше, возвращает math.huge aka inf.
Что равно: 1,8x10^308 или чуть южнее 2^1024.
Попробуй сам:
print(string.format("%.0f",number))
Я нашел это письмо на сайте пользователей lua
Ядро Lua не использует 64-битные типы данных, кроме как неявно через
size_t
или жеptrdiff_t
(которые 64-битные на 64-битной коробке).sizeof (float) == 4
sizeof (double) == 8Вы можете определить lua_Number как двойное (по умолчанию), число с плавающей запятой или любое целое число не менее 32 бит. Однако существуют побочные эффекты, и некоторые расширения могут перестать работать из-за ограниченного диапазона значений типа float или ints. Ядро должно быть хорошо, хотя.
Я наткнулся на этот вопрос, так как у меня была очень похожая проблема. В настоящее время я программирую с помощью LÖVE2D , который использует LuaJIT , основанный на Lua 5.1 , поэтому не использует целые числа. Мой личный вопрос был: могу ли я использовать одну переменную для отслеживания времени?
Что касается времени, то помимо знания того, какое значение является максимальным, вы должны, прежде всего, спросить себя, каков требуемый уровень точности, скажем, до миллисекунд, санти- или децисекунд (1, 10 или 100 мс). Или даже секунды. Почему?
Видите ли, хотя теоретически вы можете суммировать тысячи лет в секундах, используя числовые пределы Lua 5.1 , которые составляют около 2^1024 , проблема в том, что через какое-то очень долгое время (но все зависит от того, каковы ваши границы, что, если вы имеете дело с астрономическим приложением?) ваше различение моментов резко упадет...
> t = 2^1023
> print(t)
8.9884656743116e+307
> print(t+1) -- let's assume your dt is of 1 second
8.9884656743116e+307
Так что в какой-то момент даже дельта секунд становится бессмысленной. Поэтому я предлагаю проверить непосредственно ваш предел с требуемым уровнем точности...
> a,b = 0,0.1 -- the precision is 100 ms
> while a~=b do a,b = b,b+1 end
interrupted!
Я даже не стал ждать, пока найду предел, я просто прервал цикл, при этом еще прибавив 0,1 к предыдущему моменту, изменилось базовое значение a.
> print(a/60/60/24/365) -- check current limit in years!
251.54387084919
Так что определенно безопасно использовать одну переменную для отслеживания времени с помощью Lua 5.1 и LuaJIT . Лично, поскольку я программирую фреймворк общего назначения, я предпочитал делить секунды на более мелкие дроби, чтобы гарантировать максимальную точность.
(луа 5.3.4)
Максимальное число, когда он говорит «inf» при печати, составляет около
301602860200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000