BigInt for Standard ML / NJ

时间:2009-07-18 18:56:02

标签: functional-programming sml smlnj

标准ML是否有Java BigInt等价物?普通的int类型在溢出时抛出异常。

5 个答案:

答案 0 :(得分:7)

是的,请参阅IntInf结构。

答案 1 :(得分:5)

官方SML'97标准basis library引入了一个结构动物园,如Int,IntInf,Int32,Int64,LargeInt等。

要在实践中实际使用它们以使事情按预期工作,并使它们高效工作,您需要仔细查看手头的SML实现。

  • 一系列实现模仿C和Java的内存布局,因此Int32实际上是32位机器字(但有溢出检查),而Int64是64位机器字。 SML / NJ是一个值得注意的例子,它的小型算术速度很快,但它的大型算术速度很慢。

  • 另一类实现来自符号计算(LISP或计算机代数)的背景,其中Poly / ML是一个值得注意的例子。默认情况下,你有Int = IntInf = LargeInt,并且实现首先使用(部分)本机机器字作为近似值,直到它溢出然后切换到在堆上分配的非常大的整数(作为盒装值)。 Poly / ML使用GNU MP库来实现这一重要作用。

因此Int / IntInf非常有效,只要你的应用程序是关于整数,而不是特定大小的机器字:符号模型中的Int32将不适合32位硬件上的单个字,因为额外的标记位是必要的。因此,一些实际上与字算法有关的算法会降级,例如32位硬件上的SHA1。

另一方面,short-than-wordsize int隐式升级到堆分配的big int会给你比Java中的BigInt更好的东西,因为你不需要小值的完整对象开销:42将是只是寄存器中的一些位模式(带有额外的标记位),但不是堆上的重盒子。

答案 2 :(得分:0)

BigInt等效项称为LargeInt。请参阅these lecture notes以查看有关如何在int(aka Int)和LargeInt之间进行转换的一些函数。

答案 3 :(得分:0)

虽然这不是你要求的,但你实际上并不想要Java BigInt类的等价物。 Java的BigInt类实现了乘法的O(n ^ 2)时间(基本上乘以它在小学教授的方式),而不是O(n log n),这是可能的。这非常重要,因为许多琐碎的BigInt编程根本不适用于n ^ 2版本。

答案 4 :(得分:-2)

嗯,int对计算排列等问题设置了一个令人讨厌的限制。 SML需要一个更自然的大数值数据类型。