Lua加法错误

Lua addition error

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

71776119061217280 + 281474976710655

或六边形

  0x00FFFFFFFFFFFF‬
+ 0x‭FF000000000000

Lua 5.1, 5.2, 5.3 全部 return

72057594037927936 (= 0x‭100000000000000)

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

更新:

有关信息,我在 Windows 10 上看到 ZeroBrane Studio

什么颠覆了Lua5.3?在 linux (amd64) 机器上,我得到:

$ lua
Lua 5.3.4  Copyright (C) 1994-2017 Lua.org, PUC-Rio
> 71776119061217280 + 281474976710655
72057594037927935
>

这些是我使用 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),所以这可能是混淆的地方关于结果是从哪里来的。设置解释器只会改变用于 运行 和调试脚本的内容,但不会改变本地控制台(至少在当前版本中,因为有票证可能会改变它)。这不应该影响工具提示和 stack/watch windows,因为它们使用 %.16g 格式,可以使用 debugger.numformat 设置更改;控制台是唯一使用 %.17g 格式的地方,因为它是 recommended to avoid losing precision