BigInt for Standard ML/NJ

rez*_*usr 4 functional-programming sml smlnj

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

zvr*_*rba 7

是的,请参阅IntInf结构.


Mak*_*ius 5

官方的SML'97标准基础库引入了诸如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。

另一方面,将短于字号的int隐式升级为堆分配的大int可以使您获得比Java中的BigInt更好的东西,因为对于小值,您不需要完整的对象开销:42只是一点点寄存器中的模式(带有附加标记位),而不是堆上的沉重框。