Functional programming 标准ML/NJ的BigInt

Functional programming 标准ML/NJ的BigInt,functional-programming,sml,smlnj,Functional Programming,Sml,Smlnj,标准ML是否有Java BigInt等价物?正常int类型在溢出时引发异常 是的,请参见结构。BigInt等价物称为LargeInt。有关如何在int(又称int)和LargeInt之间转换的一些函数,请参见 嗯,int对计算置换之类的东西提出了一个令人讨厌的限制。SML需要使用更自然的大型数字数据类型。官方SML'97标准引入了一系列结构,如Int、IntInf、Int32、Int64、LargeInt等 要在实践中实际使用它们以使事情按预期工作,并使它们高效工作,您需要仔细查看手头的SML实

标准ML是否有Java BigInt等价物?正常int类型在溢出时引发异常

是的,请参见结构。

BigInt等价物称为LargeInt。有关如何在int(又称int)和LargeInt之间转换的一些函数,请参见

嗯,int对计算置换之类的东西提出了一个令人讨厌的限制。SML需要使用更自然的大型数字数据类型。

官方SML'97标准引入了一系列结构,如Int、IntInf、Int32、Int64、LargeInt等

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

  • 有一系列实现模仿C和Java的内存布局,因此Int32实际上是一个32位机器字(但带有溢出检查),Int64是一个64位机器字。SML/NJ就是一个显著的例子,它的小整数运算速度快,但它的大整数运算速度慢

  • 另一个实现家族来自符号计算(LISP或计算机代数)的背景,其中Poly/ML是一个显著的例子。在这里,默认情况下Int=IntInf=LargeInt,实现首先使用(部分)本机字作为近似值,直到它溢出,然后切换到堆上分配的真正大整数(作为装箱值)。Poly/ML使用gnump库来处理这个大部件

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


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

虽然这并不是您想要的,但实际上您并不想要一个与Java BigInt类等价的类。Java的BigInt类实现了O(n^2)乘法时间(本质上是按照小学的教学方式乘法),而不是O(n logn),这是可能的。这一点非常重要,因为许多琐碎的BigInt编程根本不适用于n^2版本。

来自SML基础库:“如果一个实现提供了
IntInf
结构,那么
LargeInt
必须与
IntInf
相同的结构(通过细化
整数
签名查看)。否则,如果
LargeInt
Int
不同,则必须有一个结构
Int
等于
LargeInt
,换句话说,
LargeInt
不能保证是无界的(尽管SML/NJ是),但它比
IntInf
更具可移植性(不需要存在)1.我建议不要用太大的。您更希望编译时失败,而不是在运行时出现意外的溢出。(尽管内存耗尽有其独特的魅力。)