math - ¿Cuál es la biblioteca de número grande(precisión arbitraria) estándar(o mejor soportada) para Lua?
precision bignum (5)
Estoy trabajando con grandes números que no puedo completar. Utilizando la biblioteca matemática estándar de Lua, parece que no hay una manera conveniente de preservar la precisión más allá de un límite interno. También veo que hay varias bibliotecas que se pueden cargar para trabajar con 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 (podría ser idéntico al # 2)
- http://www.gammon.com.au/scripts/doc.php?general=lua_bc (pero no puedo encontrar ninguna fuente)
Además, hay muchas bibliotecas en C que podrían llamarse desde Lua, si las consolidaciones estuvieran establecidas.
¿Has tenido alguna experiencia con una o más de estas bibliotecas?
Realmente no puedo responder, pero agregaré LGMP , un enlace GMP. No utilizado.
No es mi campo de especialización, pero esperaría que la biblioteca aritmética de precisión múltiple de GNU fuera un estándar aquí, ¿no?
Aunque no es una precisión arbitraria , Lua decNumber , un envoltorio Lua 5.1 para IBM decNumber, implementa el estándar de Aritmética Decimal General propuesto IEEE 754r. Tiene los operadores aritméticos Lua 5.1 y más, control total sobre los modos de redondeo y precisión de trabajo de hasta 69 dígitos decimales.
La biblioteca lmapm de Luiz Figueiredo, uno de los autores del lenguaje Lua.
Usé la sugerencia de Norman Ramsey para resolver el problema # 16 de Project Euler. No creo que sea un spoiler decir que la clave del problema es calcular un entero de 303 dígitos con precisión.
Estos son los pasos que necesitaba para instalar y usar la biblioteca:
Lua debe construirse con carga dinámica habilitada. Uso Cygwin, pero cambié
PLAT
ensrc/Makefile
para que sealinux
. El valor predeterminado,none
, no habilita la carga dinámica.El MAMP necesita ser construido e instalado en algún lugar que su compilador de C pueda encontrarlo. Puse
libmapm.a
en/usr/local/lib/
. Los siguientesm_apm.h
ym_apm_lc.h
fueron a/usr/local/include/
.El archivo MAKE para lmamp necesita ser alterado a la ubicación correcta de las bibliotecas Lua y MAMP. Para mí, eso significa eliminar la segunda declaración de
LUA
,LUAINC
,LUALIB
yLUABIN
y editar la declaración deMAMP
.Finalmente,
mapm.so
necesita colocarse en algún lugar para que Lua lo encuentre. Lo puse en/usr/local/lib/lua/5.1/
.
¡Gracias por todas las sugerencias!
Usar lbc en lugar de lmapm sería más fácil porque lbc es autónomo.
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)