Lua加法错误
Lua addition error
似乎 Lua 加法在处理大数字(64 位值)时不起作用。我试图计算以下内容:
71776119061217280 + 281474976710655
或六边形
0x00FFFFFFFFFFFF
+ 0xFF000000000000
Lua 5.1, 5.2, 5.3 全部 return
72057594037927936 (= 0x100000000000000)
不用拿出你的计算器就知道这是错的。奇数加偶数不是偶数。事实上,它似乎偏离了 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。
似乎 Lua 加法在处理大数字(64 位值)时不起作用。我试图计算以下内容:
71776119061217280 + 281474976710655
或六边形
0x00FFFFFFFFFFFF
+ 0xFF000000000000
Lua 5.1, 5.2, 5.3 全部 return
72057594037927936 (= 0x100000000000000)
不用拿出你的计算器就知道这是错的。奇数加偶数不是偶数。事实上,它似乎偏离了 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。