25

我正在处理无法四舍五入的大量数字。使用 Lua 的标准数学库,似乎没有方便的方法来保持超出某些内部限制的精度。我还看到有几个库可以加载以处理大数字:

  1. http://oss.digirati.com.br/luabignum/
  2. http://www.tc.umn.edu/~ringx004/mapm-main.html
  3. http://lua-users.org/lists/lua-l/2002-02/msg00312.html(可能与#2相同)
  4. http://www.gammon.com.au/scripts/doc.php?general=lua_bc(但我找不到任何来源)

此外,如果建立了绑定,可以从 Lua 调用 C中的许多库。

您对这些库中的一个或多个有任何经验吗?

4

6 回答 6

17

使用lbc代替 lmapm 会更容易,因为 lbc 是独立的。

local bc = require"bc"
s=bc.pow(2,1000):tostring()
z=0
for i=1,#s do
        z=z+s:byte(i)-("0"):byte(1)
end
print(z)
于 2009-05-14T14:10:17.390 回答
8

我使用 Norman Ramsey 的建议来解决 Project Euler 问题#16。我不认为说问题的症结在于准确计算 303 位整数是剧透。

以下是我安装和使用该库所需的步骤:

  1. Lua 需要在启用动态加载的情况下构建。我使用 Cygwin ,但我改成PLATsrc/Makefile. linux默认值 ,none不启用动态加载。

  2. MAMP需要在C 编译器可以找到的地方构建和安装。我放进libmapm.a去了/usr/local/lib/。接下来又去m_apm.h了。m_apm_lc.h/usr/local/include/

  3. lmamp的 makefile需要更改为 Lua 和 MAMP 库的正确位置。对我来说,这意味着取消注释 , , 和的第二个声明,LUA并 编辑. LUAINCLUALIBLUABINMAMP

  4. 最后,mapm.so需要放置在 Lua 可以找到的地方。我把它放在/usr/local/lib/lua/5.1/.

谢谢大家的建议!

于 2009-03-06T22:58:16.553 回答
7

Lua 语言的作者之一 Luiz Figueiredo的lmapm 库。

于 2008-11-28T21:09:30.053 回答
6

我无法真正回答,但我会添加LGMP,一个 GMP 绑定。不曾用过。

不是我的专业领域,但我希望 GNU 多精度算术库在这里成为一个标准,不是吗?

于 2008-11-13T23:16:02.330 回答
4

尽管不是任意精度,但Lua decNumber是 IBM decNumber 的 Lua 5.1 包装器,它实现了提议的通用十进制算术标准 IEEE 754r。它具有 Lua 5.1 算术运算符等,完全控制舍入模式,工作精度高达 69 位十进制数字。

于 2008-11-15T05:51:33.467 回答
1

这个问题有几个库,每个库都有你的优点和缺点,最好的选择取决于你的要求。如果lbc满足您的要求或 Luiz Figueiredo 的任何其他要求,我会说它 是一个不错的首选。对于最有效的方法,我猜想是使用 GMP 绑定,因为 GMP 是一个用于处理大整数的标准 C 库,并且经过了很好的优化。

尽管如此,如果你正在寻找一个纯 Lua 库,lua-bint 库可能是处理大整数的一个选项,我不会说它是最好的,因为上面提到的那些更有效和更完整,但通常它们需要编译 C 代码,或者设置起来很麻烦。但是,在比较纯 Lua 大整数库时,根据您的用例,它可能是一个有效的选择。该库已记录在案,代码完全被测试覆盖,并且有许多示例。但是因为我是图书馆的作者,所以请接受这个建议。

如果你的计算机中已经有 luarocks 安装,你可以使用它,或者只需在项目中下载 bint.lua 文件,因为它除了需要 Lua 5.3+ 之外没有其他依赖项。

这是一个使用它来解决 Project Euler 中的问题 #16 的小示例(在之前的答案中提到):

local bint = require 'bint'(1024)
local n = bint(1) << 1000
local digits = tostring(n)
local sum = 0
for i=1,#digits do
  sum = sum + tonumber(digits:sub(i,i))
end
print(sum) -- should output 1366
于 2020-07-09T22:23:11.670 回答