我在没有专用浮点硬件的CPU上运行Lua,具体取决于SW仿真。
从luaopt.h我可以看到一些宏被设置为double
,但它没有明确说明何时使用浮点数并且有点难以跟踪它。
如果我的脚本执行简单的操作:
a=0
a=a+1
for...
这会涉及任何级别的浮点运算吗?
如果没有那么好,那么将宏更改为long
会有什么好处?
(我当然试过但是没有工作......)
答案 0 :(得分:5)
Lua中的所有数值运算都是以浮点形式执行的(根据默认配置)。浮点和整数之间没有区别,所有值都只是数字。
用于存储Lua编号的实际C
类型在luaconf.h中设置,允许甚至实际将其更改为合适的整数类型。您首先将LUA_NUMBER
从double
更改为int
,long
或ptrdiff_t
。然后你会发现你需要调整控制字符串和数字之间转换的相关宏。当然,您可能需要消除大部分或全部基础math
库,因为math.sin()
及其朋友和邻居对整数没有特别用处。
结果将是一个Lua解释器,其中所有数字都是整数。该语言仍然允许您输入3.14
,但它将存储为3
。你的代码很可能不能完全移植到使用标准配置构建的Lua解释器,因为大量的Lua代码随便假设允许浮点运算,并且记住你编译的字节代码肯定不兼容,因为字节代码会存储数字为LUA_NUMBER
。
答案 1 :(得分:2)
有LNUM补丁(例如,由OpenWrt项目使用,它在很大程度上依赖于Lua在没有FPU的硬件上提供Web UI),它允许在Lua中使用数字的双整数/浮点表示在需要时在幕后发生转换。有了它,大多数整数计算将在不诉诸FPU的情况下执行。不幸的是,它仅适用于Lua 5.1; 5.2不受支持。
答案 2 :(得分:1)
感谢您的澄清。
总结一下,对于其他具有微型嵌入式CPU或其他没有FPU的读者:
在C中,您使用整数运算,但如果没有办法,则添加浮点数。 i = i + 1 doe不涉及浮选点操作。
在Lua,你必须做出决定。所有浮动或所有int。除非您完全删除对浮点数的支持,否则i = i + 1将涉及浮点加法运算。
如果不了解Lua的内心,后者似乎有点缺点。无论如何,我的测试仍然很快,所以到目前为止还不是nogo。
如果上述内容不正确,请提出建议。
扬