整数域 |
|
--**** should be compatible with 5.xx function intlimit() local floor = math.floor -- get highest power of 2 which Lua can still handle as integer local step = 2 while true do local nextstep = step*2 if nextstep-(nextstep-1) == 1 and nextstep > 0 then step = nextstep else break end end -- now get the highest number which Lua can still handle as integer local limit,step = step,floor(step/2) while step > 0 do local nextlimit = limit+step if nextlimit-(nextlimit-1) == 1 and nextlimit > 0 then limit = nextlimit end step = floor(step/2) end return limit end
示例
local limit = intlimit() print() print("IntegerDomain - what is the largest supported integer number?") print() --**** do not rely on Lua to print "limit" properly by itself! --local printablelimit = string.format("%d", limit) -- fails under Lua! local printablelimit = string.format("%.16e", limit) print("supported integer range is: -" .. printablelimit .. "...+" .. printablelimit)
如您所见,Lua 在处理大型整数时没有问题 - 只要您不尝试将它们转换为字符串 ;-)
为了确保整数被正确地转换为字符串(没有科学计数法),而不是使用 tostring(x),请使用 format.string("%.0f",x)
嗯,让我考虑一下要求
此外,我还做了另外两个假设
这两个假设都可以很容易地显式检查(不要忘记在测试负数时将“floor”替换为“ceil”!)。
如果要求适用,则可以使用“逐次逼近”来获取最大的可表示整数。
由于我没有提到任何具体的结果,因此除了我上面显示的假设(符号幅度编码保证了对称性)和我选择的测试之外,我并没有真正假设 IEEE
floor(x) == x
应该已经足够用于测试数字是否为整数
x-1 ~= x
只是为了排除 NaN 和 Infinity 而添加的
---- 我使用 lua 5.1 运行了这个算法,它没有完全奏效:它给出了 9007199254740994 作为最大整数,但 print(string.format("%0.f", intlimit()-1) 返回 9007199254740992 而不是 9007199254740993。我在代码中修正了三件事
floor(x) == x
无用,因为您从整数开始并进行整数稳定操作,即使超出最大整数(大于尾数所能表示的浮点数始终是整数)
x-1 ~= x
已被 x-(x-1) == 1
替换,它检查 x-1 是否可表示(它也排除 NaN 和无穷大,但它们无论如何都无法访问)
x > 0
--4xel