当处理大数字(64位值)时,似乎Lua的添加不起作用。我试图计算以下内容:
71776119061217280 + 281474976710655
或者在六进制中
0x00FFFFFFFFFFFF
+ 0xFF000000000000
Lua 5.1,5.2和5.3全部归还
72057594037927936 (= 0x100000000000000)
无需拿出计算器就可以看出这是错误的。添加到奇数的偶数不是偶数。事实上,它似乎是1(正确的结果是72057594037927935)。在hexa中,问题更加明显,因为结果应为0xFFFFFFFFFFFFFF。任何人都知道发生了什么,或者我在这里做错了什么?
有关信息,我在Windows 10上看到ZeroBrane Studio。
这些是我使用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
格式的地方,因为它是一个recommended to avoid losing precision。
什么颠覆Lua 5.3
?就像在linux(amd64)机器上一样,我得到:
$ lua
Lua 5.3.4 Copyright (C) 1994-2017 Lua.org, PUC-Rio
> 71776119061217280 + 281474976710655
72057594037927935
>