原始信息:
我需要将两个 64 位数字相乘,但 Lua 会因大数字而失去精度。(例如 99999999999999999 显示为 100000000000000000) 相乘后,我需要一个64 位解决方案,因此我需要一种方法将解决方案限制为 64 位。(我知道,如果解决方案是精确的,我可以使用% 0x10000000000000000,这样也可以)
编辑:有了 Lua 5.3 和新的 64 位整数支持,这个问题就不再存在了。整洁的。
Lua 对所有数学都使用双精度浮点数,包括整数运算(参见http://lua-users.org/wiki/FloatingPoint)。这为您提供了大约 53 位的精度,这(正如您所注意到的)比您需要的要少。
有几种不同的方法可以在 Lua 中获得更好的精度。您最好的选择是找到最积极的此类努力并加以利用。在这种情况下,您的问题已经得到解答;查看Lua 的标准(或最受支持的)大数(任意精度)库是什么?
如果你的 Lua 发行版有它的包,简单的答案是lmapm。
如果使用LuaJIT代替 Lua,则可以访问所有 C99 内置类型,包括long long
通常为 64 位的类型。
local ffi = require 'ffi'
-- Needed to parse constants that do not fit in a double:
ffi.cdef 'long long strtoll(const char *restrict str, char **restrict endptr, int base);'
local a = ffi.C.strtoll("99999999999999999", nil, 10)
print(a)
print(a * a)
=> 3803012203950112769LL
(assuming the result is truncated to 64 bits)