Lua浮点运算

时间:2014-01-06 20:27:57

标签: lua

我在没有专用浮点硬件的CPU上运行Lua,具体取决于SW仿真。

从luaopt.h我可以看到一些宏被设置为double,但它没有明确说明何时使用浮点数并且有点难以跟踪它。

如果我的脚本执行简单的操作:

a=0
a=a+1
for...

这会涉及任何级别的浮点运算吗?

如果没有那么好,那么将宏更改为long会有什么好处?

(我当然试过但是没有工作......)

3 个答案:

答案 0 :(得分:5)

Lua中的所有数值运算都是以浮点形式执行的(根据默认配置)。浮点和整数之间没有区别,所有值都只是数字。

用于存储Lua编号的实际C类型在luaconf.h中设置,允许甚至实际将其更改为合适的整数类型。您首先将LUA_NUMBERdouble更改为intlongptrdiff_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。

如果上述内容不正确,请提出建议。