Максимальное и минимальное целое в Lua
Однажды, работая с миллисекундами, меня взяли сомнения. Миллисекунды щелкают быстро. Хватит ли значащих цифр в мантиссе, чтобы хранить нужное мне целое число? Тип данных 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 лет
Вывод. Можно спать спокойно.