2

在处理大数字(64 位值)时,Lua 加法似乎不起作用。我试图计算以下内容:

71776119061217280 + 281474976710655

或六边形

  0x00FFFFFFFFFFFF‬
+ 0x‭FF000000000000

Lua 5.15.25.3都返回

72057594037927936 (= 0x‭100000000000000)

无需拿出你的计算器来看看这是错误的。偶数加上奇数不是偶数。事实上,它似乎偏离了 1(正确的结果是72057594037927935)。在六进制中,问题更加明显,因为结果应该是0xFFFFFFFFFFFFFF。任何人都知道发生了什么,或者我在这里会做错什么?

更新:

有关信息,我在 Windows 10 上使用ZeroBrane Studio看到了这一点。

4

2 回答 2

2

什么是 Lua 的颠覆5.3?就像在 linux (amd64) 机器上一样,我得到:

$ lua
Lua 5.3.4  Copyright (C) 1994-2017 Lua.org, PUC-Rio
> 71776119061217280 + 281474976710655
72057594037927935
>
于 2018-03-04T17:58:48.327 回答
1

这些是我使用 ZeroBrane Studio 附带的 Lua 解释器得到的结果:

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

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

72057594037927936
7.2057594037928e+016

路亚 5.2:

72057594037927936
7.2057594037928e+016

路亚 5.3

72057594037927936
72057594037927935

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

本地控制台总是使用执行 IDE 的解释器,在所有平台上都是 Lua 5.1(实际上是 LuaJIT),所以这可能是结果混乱的来源。设置解释器只会改变用于运行和调试脚本的内容,而不是本地控制台(至少在当前版本中,因为有票证可能会改变它)。这不应该影响工具提示和堆栈/监视窗口,因为它们使用%.16g格式,可以使用debugger.numformat设置进行更改;%.17g控制台是唯一使用格式的地方,因为它是建议避免丢失精度的地方。

于 2018-03-04T18:55:43.840 回答