Qual é o padrão (ou melhor suportado) grande número (de precisão arbitrária) biblioteca para Lua?
Pergunta
Eu estou trabalhando com grandes números que eu não posso ter off arredondado. Usando biblioteca de matemática padrão de Lua, parece haver nenhuma maneira conveniente para preservar a precisão passado algum limite interno. Vejo também existem várias bibliotecas que podem ser carregados para trabalhar com grandes números:
- http://oss.digirati.com.br/luabignum/
- http://www.tc.umn.edu/~ringx004/ MAPM-main.html
- http://lua-users.org/lists/ lua-l / 2002-02 / msg00312.html (pode ser idêntico ao # 2)
- http://www.gammon.com.au/scripts/ doc.php dentro? geral = lua_bc (mas não consigo encontrar qualquer fonte)
Além disso, há muitas bibliotecas em C que poderia ser chamado da Lua, se as ligações onde estabelecidos.
Você já teve alguma experiência com uma ou mais dessas bibliotecas?
Solução
O lmapm biblioteca por Luiz Figueiredo, um dos autores da linguagem Lua.
Outras dicas
Usando lbc vez de lmapm seria mais fácil porque lbc é auto-suficiente.
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)
Eu usei a sugestão de Norman Ramsey para resolver o problema projeto Euler # 16 . Eu não acho que é um spoiler dizer que o cerne do problema está calculando um número inteiro de 303 dígitos com precisão.
Aqui estão os passos que necessários para instalar e usar a biblioteca:
-
Lua precisa ser construído com carregamento dinâmico habilitado. Eu uso o Cygwin, mas eu mudei
PLAT
emsrc/Makefile
serlinux
. O padrão,none
, não permite o carregamento dinâmico. -
O MAMP precisa ser construído e instalado em algum lugar que o seu compilador C pode encontrá-lo. Coloquei
libmapm.a
em/usr/local/lib/
. Próximam_apm.h
em_apm_lc.h
foi para/usr/local/include/
. -
O makefile para lmamp necessidades de ser alterada para a localização correcta das bibliotecas Lua e MAMP. Para mim, isso significa que descomentando a segunda declaração de
LUA
,LUAINC
,LUALIB
eLUABIN
e editar a declaração deMAMP
. -
Finalmente,
mapm.so
precisa ser colocado em algum lugar que Lua vai encontrá-lo. Eu colocá-lo em/usr/local/lib/lua/5.1/
.
Obrigado a todos pelas sugestões!
Eu realmente não posso responder, mas vou acrescentar LGMP , uma ligação de GMP. Não usado.
Não minha área de especialização, mas eu esperaria que o múltiplo de precisão biblioteca aritmética GNU a ser bastante um padrão aqui, não?
Apesar de não ser arbitrária precisão, Lua decNumber , a Lua 5.1 wrapper para IBM decNumber, implementa a proposta 754r Geral Decimal aritmética padrão IEEE. Tem as Lua 5.1 operadores aritméticos e muito mais, o controle total sobre o arredondamento modos, e precisão de trabalho de até 69 dígitos decimais.