Максимальное и минимальное целое в Lua

Опубликовано в QLua

Однажды, работая с миллисекундами, меня взяли сомнения. Миллисекунды щелкают быстро. Хватит ли значащих цифр в мантиссе, чтобы хранить нужное мне целое число? Тип данных number в языке Lua ведь не целочисленный, а 8-битный плавающий...

Слегка погуглив, осознал, что не я первый задался этим вопросом. Даже готовый скрипт нашелся, запустив который, можно получить ответ на искомый вопрос.

function intlimit()
  local floor = math.floor

  local step = 2
  while true do
    local nextstep = step*2
    if (floor(nextstep) == nextstep) and (nextstep-1 ~= nextstep) then
      step = nextstep
    else
      break
    end
  end

  -- now get the highest number which Lua can still handle as integer
  local limit,step = step,step/2
  while step > 0 do
    local nextlimit = limit+step
    if (floor(nextlimit) == nextlimit) and (nextlimit-1 ~= nextlimit) then
      limit = nextlimit
    end
    step = floor(step/2)
  end
  return limit
end

  local limit = intlimit()

  local printablelimit = string.format("%.16e", limit)

message("supported integer range is: -" ..  printablelimit .. "...+" .. printablelimit,1)

 

Что мы увидим, запустив этот скрипт?

supported integer range is: -9.0071992547409940e+015...+9.0071992547409940e+015

Много ли это?

В году 365*24*60*60*1000 = 31536000000 миллисекунд

Делим 9.0071992547409940e+015 на 31536000000 и получаем 285 000 лет

Вывод. Можно спать спокойно.

 

Добавить комментарий


Защитный код
Обновить

Архив QLua