在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工作。
答案 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