整数域

lua-users home
wiki

以下代码计算了 Lua(双精度浮点数)可以精确表示的整数的实际限制 - 此外,它也是“逐次逼近”技术的很好的示例

--**** 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)

--AndreasRozek


正确性可以证明吗?它是否假设 IEEE? --DavidManura

嗯,让我考虑一下要求

此外,我还做了另外两个假设

这两个假设都可以很容易地显式检查(不要忘记在测试负数时将“floor”替换为“ceil”!)。

如果要求适用,则可以使用“逐次逼近”来获取最大的可表示整数。

由于我没有提到任何具体的结果,因此除了我上面显示的假设(符号幅度编码保证了对称性)和我选择的测试之外,我并没有真正假设 IEEE

--AndreasRozek

---- 我使用 lua 5.1 运行了这个算法,它没有完全奏效:它给出了 9007199254740994 作为最大整数,但 print(string.format("%0.f", intlimit()-1) 返回 9007199254740992 而不是 9007199254740993。我在代码中修正了三件事

--4xel


最近更改 · 偏好设置
编辑 · 历史记录
最后编辑于 2016 年 4 月 15 日下午 6:54 GMT (差异)