代码之家  ›  专栏  ›  技术社区  ›  Jon Ericson Homunculus Reticulli

Lua的标准(或最受支持的)大数(任意精度)库是什么?

  •  20
  • Jon Ericson Homunculus Reticulli  · 技术社区  · 16 年前

    我正在处理大量的数字,这些数字我不能四舍五入。使用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
    4. http://www.gammon.com.au/scripts/doc.php?general=lua_bc (但我找不到任何来源)

    此外,还有 many libraries 在C中,如果绑定已建立,则可以从Lua调用。

    您是否有过使用一个或多个此类库的经验?

    5 回复  |  直到 10 年前
        1
  •  17
  •   lhf    4 年前

    使用 lbc 代替lmapm会更容易,因为lbc是自包含的。

    local bc = 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)
    
        2
  •  8
  •   Jon Ericson Homunculus Reticulli    16 年前

    我用诺曼·拉姆齐的建议来解决欧拉计划的问题 #16

    以下是安装和使用库所需的步骤:

    1. PLAT 在里面 src/Makefile 成为 linux . 默认情况下, none

    2. MAMP 需要构建并安装在C编译器可以找到的地方。我把 libmapm.a /usr/local/lib/ . 下一个 m_apm.h m_apm_lc.h /usr/local/include/ .

    3. 的生成文件 lmamp LUA , LUAINC , LUALIB LUABIN 以及编辑 MAMP

    4. mapm.so 需要放在Lua能找到的地方。我把它放在 /usr/local/lib/lua/5.1/ .

    谢谢大家的建议!

        3
  •  7
  •   Norman Ramsey    16 年前

    lmapm library Luiz Figueiredo,Lua语言的作者之一。

        4
  •  6
  •   PhiLho    16 年前

    我真的不能回答,但我要补充一点 LGMP ,一种GMP绑定。没有用。

        5
  •  4
  •   Doug Currie    16 年前

    虽然不是 任意的 精确 Lua decNumber 是IBM decNumber的LUA5.1包装器,实现了建议的通用十进制算术标准IEEE 754r。它具有Lua 5.1算术运算符和更多,完全控制舍入模式,工作精度高达69位小数。

        6
  •  1
  •   Eduardo Bart    5 年前

    有几个库可以解决这个问题,每个库都有您的优点 缺点是,最好的选择取决于你的要求。我会说 lbc 满足您的要求或Luiz Figueiredo的任何其他要求。对于最有效的一个,我想应该是任何使用GMP绑定的方法,因为GMP是处理大整数的标准C库,并且经过了很好的优化。

    不过如果你想找一个纯Lua的, lua-bint 库可能是处理大整数的一个选项, 我不会说这是最好的,因为有更高效的 根据您的用例,它可能是一个有效的选择。图书馆有文件记录, 代码完全包含在测试中,并且有许多示例。但接受这一建议,并给予足够的支持 因为我是图书馆的作者。

    要安装,您可以使用Luarock,如果您的计算机中已经有它,或者只需下载 bint.lua 文件,因为它除了需要Lua5.3+之外没有其他依赖项。

    (在先前的答复中提到):

    local bint = require 'bint'(1024)
    local n = bint(1) << 1000
    local digits = tostring(n)
    local sum = 0
    for i=1,#digits do
      sum = sum + tonumber(digits:sub(i,i))
    end
    print(sum) -- should output 1366