Lua 获取数字类型

在Lua中,对任何数字使用type函数总是返回'number'。是否有一种函数可以告诉你Lua解释器是使用32位浮点数、64位双精度浮点数、整数还是其他类型的数字类型?

我尝试编写这样一个函数:

function numbertype()
  local rational = 5 / 2

  if rational == 2 then
    -- equals 2
    return 'int'
  else
    -- about 2.5
    return 'double' -- 但它可能是32位浮点数或其他类型吗?
  end
end

print(numbertype())

它还不能检测浮点数、双精度浮点数和未知类型之间的差异。如何查询以查看Lua解释器中的数字类型是否等效于Lua中的int、float或double?我希望它能在纯Lua中工作。

点赞
用户1217412
用户1217412

根据《Lua 5.1参考手册》,数字仅限于双精度浮点数。要使用其他类型,必须使用修改后的 luaconf.h 重新编译Lua。

2012-10-13 01:33:58
用户734069
用户734069

Pure Lua无法从解释器中查询这些信息。由于解释器使用不同类型的能力相当自由(您可以选择任何浮点或整数类型),将此暴露给Lua的唯一方法是编写解释器以预期它可以编译的每种可能类型的数字。

一般情况下,你不应该关心这些。使用除double之外的东西的应用程序是最稀有的。即使是必须处理ARM和他们可怕的浮点数学的LuaJIT,仍然将其使用整数数学的能力隐藏为一种优化;Lua代码无法区分。

这就是应该的。

2012-10-13 01:55:33
用户1560049
用户1560049

也许您可以使用以下的解决方案。计算 number%1。如果余数是0,则它很可能是类似于整数的数字。

2012-10-14 08:42:38
用户1721424
用户1721424

根据 catwell 的评论中提供的有用资源,我编写了一个函数,它可以根据字节码头返回数字类型。这个函数很有用,但是永远不应该被使用,因为它只适用于特定的解释器。如果要使用 lua 5.2 或 luajit,则需要完全重写它,这会为代码重用带来不必要的负担。

相反,Lua 脚本应独立于所使用的解释器或数字类型进行编写。

作为完整性的一部分,这是函数:

-- only work in Lua 5.1
function numbertype()
  local headertypes = {
    ['\4\1'] = 'int32',
    ['\8\1'] = 'int64',
    ['\4\0'] = 'float32',
    ['\8\0'] = 'float64'}

  -- returns nil if the type is something else
  return headertypes[string.dump(function () end):sub(11,12)]
end
2012-10-24 00:06:17