Lua 浮点运算

Posted

技术标签:

【中文标题】Lua 浮点运算【英文标题】:Lua floating point operations 【发布时间】:2014-01-24 08:53:04 【问题描述】:

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

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

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

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

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

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

(我当然试过,但没用……)

【问题讨论】:

你是在说LUA_NUMBER in luaconf.h吗? 【参考方案1】:

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

用于存储 Lua 编号的实际 C 类型在 luaconf.h 中设置,将其更改为合适的整数类型是允许的,甚至是实用的。首先将LUA_NUMBERdouble 更改为intlong,或者可能是ptrdiff_t。然后你会发现你需要调整控制字符串和数字之间转换的相关宏。当然,您可能需要删除大部分或全部基本 math 库,因为 math.sin() 及其朋友和邻居对整数并不是特别有用。

结果将是一个 Lua 解释器,其中所有数字都是整数。该语言仍允许您键入3.14,但它将存储为3。您的代码可能无法完全移植到使用标准配置构建的 Lua 解释器,因为大量 Lua 代码随意假设允许浮点运算,请记住,您编译的字节码肯定不兼容,因为字节码将存储编号为LUA_NUMBER

【讨论】:

Lua 5.3 引入了整数。【参考方案2】:

有一个LNUM 补丁(例如,由OpenWrt 项目使用,该项目严重依赖 Lua 在没有 FPU 的硬件上提供 Web UI),它允许 Lua 中数字的双整数/浮点表示,并在后面发生转换需要时的场景。有了它,大多数整数计算都将在不借助 FPU 的情况下执行。不幸的是,它只适用于 Lua 5.1;不支持 5.2。

【讨论】:

以上是关于Lua 浮点运算的主要内容,如果未能解决你的问题,请参考以下文章

java运算疑惑 整型和浮点型混合运算

FPU 浮点运算单元和DSP指令

使用浮点运算对整数数据进行右移运算?

JS 乘法运算出现了浮点,该怎么解决

为啥 nvprof 没有浮点除法运算的指标?

向量双双浮点运算