Lua 加法错误

看起来 Lua 在处理大数(64 位数值)的加法时似乎存在问题。我尝试计算以下内容:

71776119061217280 + 281474976710655

或者使用十六进制表示:

  0x00FFFFFFFFFFFF‬
+ 0x‭FF000000000000

Lua 5.15.25.3 都返回了

72057594037927936(= 0x‭100000000000000)

不需要计算器即可看出这是不正确的。偶数加上奇数并不等于偶数。事实上,似乎相差 1(正确结果应该是 72057594037927935)。在十六进制中,这个问题更加明显,因为结果应该是 0xFFFFFFFFFFFFFF。 有人知道发生了什么,或者我在这里做错了什么吗?

更新:

补充信息,我在 Windows 10 上使用 ZeroBrane Studio 看到了这个问题。

点赞
用户2136640
用户2136640

Lua的哪个子版本 5.3?在一个Linux(amd64)机器上,我得到:

$ lua
Lua 5.3.4  Copyright (C) 1994-2017 Lua.org, PUC-Rio
> 71776119061217280 + 281474976710655
72057594037927935
>
2018-03-04 17:58:48
用户1442917
用户1442917

以下是使用与 ZeroBrane Studio 附带的 Lua 解释器运行此脚本所获得的结果:

print(("%.17g"):format(71776119061217280 + 281474976710655))
print(71776119061217280 + 281474976710655)

Lua 5.1 (实际上是 LuaJIT 解释器):

72057594037927936
7.2057594037928e+016

Lua 5.2:

72057594037927936
7.2057594037928e+016

Lua 5.3:

72057594037927936
72057594037927935

如果您在 IDE 中的本地控制台中运行此脚本,则会看到 72057594037927936,因为它在序列化结果期间使用了 %.17g 格式。

本地控制台始终使用 IDE 执行的解释器,所有平台上默认为 Lua 5.1 (实际上是 LuaJIT),因此这可能是有关结果混淆的原因所在。设置解释器仅更改运行和调试脚本时使用的解释器,但不更改本地控制台(至少在当前版本中是如此,因为有可能会更改该设置)。这不应影响工具提示和堆栈/监视窗口,因为它们使用 %.16g 格式,可以使用 debugger.numformat 设置进行更改;控制台是仅在实际上是 建议使用它以避免损失精度%.17g 格式所使用的唯一地方。

2018-03-04 18:55:43