如何在保持精度的同时限制Lua中的数字?

时间:2012-10-30 17:01:07

标签: lua numbers limit

原始讯息:

  

我需要将两个64位数相乘,但Lua正在失去精度   有大数字。 (例如99999999999999999显示为   100000000000000000)乘法后我需要一个 64位解决方案,   所以我需要一种方法将解决方案限制为64位。 (我知道,如果   解决方案是准确的,我可以使用%0x10000000000000000 ,   所以这也会起作用)

编辑:使用Lua 5.3和新的64位整数支持,此问题不再存在。整齐。

2 个答案:

答案 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位)