原始讯息:
我需要将两个64位数相乘,但Lua正在失去精度 有大数字。 (例如99999999999999999显示为 100000000000000000)乘法后我需要一个 64位解决方案, 所以我需要一种方法将解决方案限制为64位。 (我知道,如果 解决方案是准确的,我可以使用%0x10000000000000000 , 所以这也会起作用)
编辑:使用Lua 5.3和新的64位整数支持,此问题不再存在。整齐。
答案 0 :(得分:3)
Lua对所有数学使用双精度浮点数,包括整数运算(参见http://lua-users.org/wiki/FloatingPoint)。这为您提供了大约53位的精度,(正如您所注意到的)低于您的需要。
有几种不同的方法可以在Lua中获得更好的精确度。你最好的选择是找到最积极的努力并捎带它。在这种情况下,您的问题已经得到了回答;看看What is the standard (or best supported) big number (arbitrary precision) library for Lua?
如果你的Lua发行版有包,那么简单的答案就是lmapm。
答案 1 :(得分:1)
如果使用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
(假设结果被截断为64位)