【问题标题】:How to present big_int?如何呈现 big_int?
【发布时间】:2012-05-09 11:19:00
【问题描述】:

我正在使用big_int 类型。我查看了 OCaml 的库 Pervasives

例如:在Int32

let t = 5l
Printf.printf "%ld" t

如果我想声明big_int,我该如何定义t 和哪个%?d

【问题讨论】:

    标签: ocaml bignum


    【解决方案1】:

    下面是一个顶级会话。如果您使用编译器,#load 指令将成为命令行链接选项:

    # #load "nums.cma" ;;
    # let t = Big_int.big_int_of_int 5 ;;
    val t : Big_int.big_int = <abstr>
    # Printf.printf "%s" (Big_int.string_of_big_int t) ;;
    5- : unit = ()
    

    对于不适合原生int 的数字,请使用Big_int.big_int_of_string。示例:Big_int.big_int_of_string "99999999999999999999999"

    完整的函数列表是here

    最后,Big_int 模块相当陈旧且笨拙。该界面可以追溯到 caml-light,其中的模块系统是初级的。这就是为什么每个函数名都重复“big_int...”的原因。如果您现在选择大型整数库,我会推荐Zarith,它既现代又高效。 Zarith 的缺点是它是一个单独的下载(目前)。

    【讨论】:

    • 抱歉这个新手问题,但是你如何为编译做一个命令行链接?
    • @DrXorile 这是一个新问题,如果您将其作为每个人都可以看到的新问题提出,您可能会在 5 分钟内得到答案。 ocamlc nums.cma t.mlocamlopt nums.cmxa t.ml.
    【解决方案2】:

    有几个用于 OCaml 的现代“大数字”库,都是关于 GNU MP 的接口:

    1. 我自己的 mlgmp,它作为 libgmp-ocaml 随许多 Linux 发行版一起提供。
    2. 来自 Bertrand Jeannet 的 mlgmpidl(注意:mlgmp 和 mlgmpidl 都向 ocamlfind 声明自己是 Gmp 包,因此存在奇怪的冲突)。
    3. ZArith

    ZArith 更好有两个原因:

    1. 在分配 GNU MP 对象之前,它会尽可能多地尝试对机器整数执行计算。
    2. 它在 OCaml 堆内分配 GNU MP 对象,这与通过 malloc() 的正常分配方案相反,后者不太适合函数式编程。

    【讨论】:

      猜你喜欢
      • 2018-11-23
      • 2018-05-23
      • 2021-09-11
      • 2021-07-12
      • 2016-05-06
      • 2011-04-07
      • 1970-01-01
      • 1970-01-01
      • 2011-09-09
      相关资源
      最近更新 更多