我正在处理我无法完成的大数字。使用Lua的标准数学库,似乎没有方便的方法来保持精度超过某些内部限制。我还看到有几个库可以加载来处理大数字:
此外,如果绑定已建立,则可以从Lua调用C中的many libraries。
您是否有过使用这些库中的一个或多个的经验?
答案 0 :(得分:15)
使用lbc代替lmapm会更容易,因为lbc是自包含的。
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)
答案 1 :(得分:6)
Luiz Figueiredo的lmapm library,Lua语言的作者之一。
答案 2 :(得分:6)
我使用Norman Ramsey的建议来解决Project Euler问题#16。我认为问题的关键在于准确计算303位整数,这并不是一个扰流。
以下是我需要安装和使用该库的步骤:
Lua需要在启用动态加载的情况下构建。我使用Cygwin,但我将PLAT
中的src/Makefile
更改为linux
。默认值none
无法启用动态加载。
需要构建MAMP并安装在C编译器可以找到的地方。我将libmapm.a
放在/usr/local/lib/
中。下一个m_apm.h
和m_apm_lc.h
转到/usr/local/include/
。
需要将lmamp的makefile更改为Lua和MAMP库的正确位置。对我而言,这意味着取消注释LUA
,LUAINC
,LUALIB
和LUABIN
的第二个声明并编辑MAMP
的声明。
最后,mapm.so
需要放在Lua找到的地方。我把它放在/usr/local/lib/lua/5.1/
。
谢谢大家的建议!
答案 3 :(得分:5)
我无法回答,但我会添加LGMP,一个GMP绑定。没用过。
不是我的专业领域,但我希望GNU多精度算术库在这里非常标准,不是吗?
答案 4 :(得分:3)
虽然不是任意精度,Lua decNumber,IBM decNumber的Lua 5.1包装器,实现了建议的通用十进制算术标准IEEE 754r。它具有Lua 5.1算术运算符和更多,完全控制舍入模式,工作精度高达69位十进制数。
答案 5 :(得分:1)
有几个问题库,每个都有您的优点 和缺点,最佳选择取决于您的要求。我会说 lbc是一个不错的首选 满足您的要求或Luiz Figueiredo的任何其他要求。对于最高效的应用程序,我猜可能会使用GMP绑定,因为GMP是用于处理大整数的标准C库,并且经过了很好的优化。
尽管如此,如果您正在寻找纯Lua,lua-bint 库可能是处理大整数的一种选择, 我不会说这是最好的,因为效率更高 和完整的代码,例如上面提到的代码,但是通常它们需要编译C代码 否则可能会麻烦设置。但是当比较纯Lua大整数库时 根据您的用例,它可能是一个有效的选择。该库已记录在案, 测试完全涵盖的代码,并包含许多示例。但是,请接受以下建议: 盐,因为我是图书馆作者。
要安装,如果您已经在计算机中安装了luarocks,则可以直接下载 bint.lua 文件,因为它除了需要Lua 5.3+之外没有其他依赖项。
这里是一个小示例,使用它来解决Euler项目中的问题16 (在先前的答案中提到):
TCHAR szPath[MAX_PATH + 1];
DWORD result = GetTempPath(MAX_PATH + 1, szPath);
if (result != ERROR_SUCCESS) {
// check GetLastError()
}