如何呈现big_int?

时间:2012-05-09 11:19:00

标签: ocaml bignum

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

例如:在Int32

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

我如何定义t以及%?d如果我要声明它是big_int

2 个答案:

答案 0 :(得分:8)

下面是一个顶级会话。如果您使用编译器,#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的缺点是它是一个单独的下载(暂时)。

答案 1 :(得分:3)

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

  1. 我自己的mlgmp,随许多Linux发行版附带libgmp-ocaml。
  2. 来自Bertrand Jeannet的
  3. mlgmpidl(注意:mlgmp和mlgmpidl都将自己声明为ocamlfind作为Gmp包,因此发生了奇怪的冲突)。
  4. ZArith
  5. ZArith更好有两个原因:

    1. 在分配GNU MP对象之前,它尽可能地尝试对机器整数执行计算。
    2. 它在OCaml堆中分配GNU MP对象,而不是通过malloc()的正常分配方案,这不是非常适合函数式编程。