2008-11-13 17 views
18

Je travaille avec de grands nombres que je ne peux pas arrondir. En utilisant la bibliothèque mathématique standard de Lua, il semble qu'il n'y ait aucun moyen pratique de conserver la précision au-delà de certaines limites internes. Je vois aussi il y a plusieurs bibliothèques qui peuvent être chargés de travailler avec de grands nombres:Quelle est la bibliothèque standard (ou la mieux supportée) de grand nombre (précision arbitraire) pour 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 (peut être identique à # 2)
  4. http://www.gammon.com.au/scripts/doc.php?general=lua_bc (mais je ne peux pas trouver toute source)

De plus, il y a many libraries en C qui pourrait être appelé depuis Lua, si les liaisons étaient établies.

Avez-vous déjà utilisé une ou plusieurs de ces bibliothèques?

+1

J'ai écrit plusieurs liaisons Lua pour les grandes bibliothèques numériques: BLC, LBN, lint64, lmapm, LQD, tous disponibles à http://www.tecgraf.puc-rio.br/~lhf/ftp/ lua /. Ils ont des caractéristiques et des exigences différentes. – lhf

Répondre

5

Le lmapm library de Luiz Figueiredo, l'un des auteurs de la langue Lua.

5

Je ne peux pas vraiment répondre, mais je vais ajouter LGMP, une liaison GMP. Non utilisé.

Ce n'est pas mon domaine d'expertise, mais je m'attendrais à ce que la bibliothèque d'arithmétique de précision multiple GNU soit assez standard ici, non?

+1

Ah. C'est utile car la documentation de GMP ne l'énumère pas: http://gmplib.org/manual/Language-Bindings.html#Language-Bindings –

3

Bien que pas arbitraire précision, Lua decNumber, un emballage Lua 5.1 pour IBM decNumber, met en œuvre le projet général décimal Arithmétique norme IEEE 754r. Il a les opérateurs arithmétiques de Lua 5.1 et plus, le plein contrôle sur les modes d'arrondi, et la précision de travail jusqu'à 69 chiffres décimaux.

+1

69? C'est environ le tiers de ce dont j'ai besoin. (Je travaille sur .) –

6

J'ai utilisé la suggestion de Norman Ramsey pour résoudre le problème du projet Euler #16. Je ne pense pas que ce soit un spoiler de dire que le nœud du problème est de calculer un entier de 303 chiffres avec précision.

Voici les étapes que je avais besoin pour installer et utiliser la bibliothèque:

  1. Lua doit être construit avec le chargement dynamique activé. J'utilise Cygwin, mais j'ai changé PLAT en src/Makefile pour être linux. La valeur par défaut, none, n'autorise pas le chargement dynamique. Le MAMP doit être construit et installé quelque part que votre compilateur C peut trouver. Je mets libmapm.a en /usr/local/lib/. Suivant m_apm.h et m_apm_lc.h est allé à /usr/local/include/. Le fichier makefile pour lmamp doit être modifié pour l'emplacement correct des bibliothèques Lua et MAMP. Pour moi, cela signifie de décommenter la deuxième déclaration de LUA, LUAINC, LUALIB, et LUABIN et d'éditer la déclaration de MAMP.

  2. Enfin, mapm.so doit être placé quelque part que Lua le trouvera. Je l'ai mis au /usr/local/lib/lua/5.1/.

Merci à tous pour vos suggestions!

13

L'utilisation de lbc au lieu de lmapm serait plus simple car lbc est autonome.

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)