2008-11-13 16 views
18

Я работаю с большими числами, которые я не могу округлить. Используя стандартную математическую библиотеку Lua, похоже, нет удобного способа сохранить точность за пределами некоторого внутреннего предела. Я также вижу, есть несколько библиотек, которые могут быть загружены, чтобы работать с большими числами:Что такое стандартная (или самая лучшая) библиотека большого числа (произвольная точность) для 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 (но я не могу найти какой-либо источник)

Кроме того, в C есть many libraries, которые могут быть вызваны из Lua, если привязки установлены.

У вас был опыт работы с одной или несколькими из этих библиотек?

+1

Я написал Lua привязки для нескольких больших чисел библиотек: LBC, LBN, lint64, lmapm, lqd, все имеющиеся на http://www.tecgraf.puc-rio.br/~lhf/ftp/ Lua /. У них разные функции и требования. – lhf 2013-08-14 12:35:35

ответ

5

На самом деле я не могу ответить, но добавлю LGMP, привязку к GMP. Не используется.

Не моя экспертиза, но я ожидал бы, что библиотека арифметических данных с множественными точками GNU будет вполне стандартным здесь, нет?

+1

Ах. Это полезно, поскольку документация по GMP не перечисляет его: http://gmplib.org/manual/Language-Bindings.html#Language-Bindings – 2008-11-13 23:46:31

3

Хотя не произвольная точность, Lua decNumber, Lua 5,1 обертка для IBM decNumber, реализует предложенный General Decimal Арифметика стандарт IEEE 754r. Он имеет арифметические операторы Lua 5.1 и многое другое, полный контроль над режимами округления и точность работы до 69 десятичных цифр.

+1

69? Это примерно треть, сколько мне нужно. (Я работаю над .) – 2008-11-17 22:58:22

6

Я использовал предложение Нормана Рэмси для решения проблемы Эйлера Эйлера #16. Я не думаю, что это спойлер, чтобы сказать, что суть проблемы состоит в том, чтобы точно вычислить целое число из 303 цифр.

Вот шаги, которые я должен был установить и использовать библиотеку:

  1. Lua должен быть построен с поддержкой динамической загрузки. Я использую Cygwin, но я изменил PLAT в src/Makefile, чтобы быть linux. Значение по умолчанию, none, не включает динамическую загрузку.

  2. Необходимо установить и установить MAMP, где ваш компилятор C может его найти. Я положил libmapm.a в /usr/local/lib/. Следующие m_apm.h и m_apm_lc.h отправились в /usr/local/include/.

  3. Файл makefile для lmamp должен быть изменен в правильном месте библиотек Lua и MAMP. Для меня это означает разглашение второй декларации LUA, LUAINC, LUALIB и LUABIN и редактирование декларации MAMP.

  4. Наконец, mapm.so необходимо разместить где-нибудь, чтобы найти его. Я положил его на /usr/local/lib/lua/5.1/.

Спасибо всем за предложения!

13

Использование 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)