Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在保持精度的同时限制Lua中的数字?_Lua_Numbers_Limit - Fatal编程技术网

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

如何在保持精度的同时限制Lua中的数字?,lua,numbers,limit,Lua,Numbers,Limit,原始信息: 我需要将两个64位数字相乘,但Lua正在失去精度 大数字。(例如,999999999999999显示为 1000000000000000)相乘后,我需要一个64位解决方案, 所以我需要一种方法将解决方案限制为64位。(我知道,如果 解决方案将是精确的,我可以使用%0x100000000000000, 所以这也行) 编辑:使用Lua 5.3和新的64位整数支持,这个问题不再存在。整洁。Lua对所有数学都使用双精度浮点,包括整数算术(请参阅)。这将为您提供大约53位的精度,这(正如您所注

原始信息:

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


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

Lua对所有数学都使用双精度浮点,包括整数算术(请参阅)。这将为您提供大约53位的精度,这(正如您所注意到的)比您需要的精度要低

有几种不同的方法可以在Lua中获得更好的精度。你最好的办法是找到最活跃的这种努力,然后把它背回去。在这种情况下,您的问题已经得到了回答;退房

如果您的Lua发行版有相应的软件包,那么简单的答案是。

如果您使用Lua替代,您可以访问所有C99内置类型,包括
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)

=>
380301203950112769ll
(假设结果被截断为64位)

我的建议是修改源代码并在解释器中获得您自己的类型。大多数情况下,您将嵌入定制的解释器anyway@texasbruce:不需要修改解释器;那太过分了。您可以添加类型,而无需直接修改解释器。只需创建一个向Lua公开的模块。还要注意,您需要128位来表示两个64位数字的乘积。无论如何,如果您想要64位结果,则不需要。如果OP只需要处理整数,那么使用代替lmapm会更容易,因为lbc是自包含的。我相信luajit支持数字文字的LL后缀。