0

在 Lua 中,对任何数字使用 type 函数总是返回“数字”。是否有一个函数可以告诉您 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

4 回答 4

5

Pure Lua 无法从解释器那里询问这些事情。由于解释器使用不同类型的能力是非常自由的(你可以选择任何浮点或整数类型),将其暴露给 Lua 的唯一方法是让解释器编码以预测每种可能的数字类型它可以编译。

一般来说,你不应该费心去关心。使用双精度以外的应用程序充其量是很少见的。即使是不得不处理 ARM 及其糟糕的浮点数学的 LuaJIT,仍然隐藏其有效使用整数数学作为优化的能力;Lua 代码无法区分。

这是应该的。

于 2012-10-13T01:55:33.200 回答
1

根据Lua 5.1 Reference Manual,数字只是双精度浮点数。要使用另一种类型,Lua 必须使用修改后的luaconf.h.

于 2012-10-13T01:33:58.293 回答
0

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

于 2012-10-14T08:42:38.887 回答
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
于 2012-10-24T00:06:17.020 回答