Lua获得数字类型

时间:2012-10-13 01:20:48

标签: 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' -- but could it be a 32 bit float or something else?
  end
end

print(numbertype())

它还无法检测浮点数,双打数和未知类型之间的差异。如何在Lua的解释器中查询Lua的数字类型是否等同于int,float或double?我希望它能用纯净的Lua工作。

4 个答案:

答案 0 :(得分:5)

Pure Lua无法从翻译中查询这些事情。由于解释器使用不同类型的能力是相当自由的形式(您可以选择任何浮点或整数类型),将此公开给Lua的唯一方法是将解释器编码以预测每种可能的数字类型它可以用。编译。

一般来说,你不应该打扰照顾。使用除双打之外的其他应用程序的应用程序充其量是罕见的。甚至LuaJIT,它必须处理ARM及其可怕的浮点数学,仍然隐藏其有效地使用整数数学作为优化的能力; Lua代码无法区分。

应该是这样。

答案 1 :(得分:1)

根据Lua 5.1 Reference Manual,数字只是双精度浮点数。要使用其他类型,必须使用修改后的luaconf.h重新编译Lua。

答案 2 :(得分:0)

也许您可以使用以下workRround。计算数字%1。如果余数为0,则很可能是整数。

答案 3 :(得分:0)

从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