Memory 环境(如Ruby)如何处理大量整数?

Memory 环境(如Ruby)如何处理大量整数?,memory,integer,abstraction,math,computation,Memory,Integer,Abstraction,Math,Computation,我在Ruby(MRI)中的整数拒绝溢出。我注意到类从fixnum变为bignum,但我想知道这是如何建模的,ruby使用什么样的过程来对这些大整数执行算术。我在SCHEME和其他环境中都见过这种行为 我问这个问题是因为我想在C程序中实现类似的东西,并且想知道bignum+bignum如何简化为原始操作 有指针吗?Erlang也会这样做。您可以查看erl_接口模块中的源代码(C语言)。基本上,它可以归结为长的加法/乘法/除法/减法。有很多优化可以从那里完成(duh),所以不建议您自己滚动。我建议您

我在Ruby(MRI)中的整数拒绝溢出。我注意到类从fixnum变为bignum,但我想知道这是如何建模的,ruby使用什么样的过程来对这些大整数执行算术。我在SCHEME和其他环境中都见过这种行为

我问这个问题是因为我想在C程序中实现类似的东西,并且想知道bignum+bignum如何简化为原始操作


有指针吗?

Erlang也会这样做。您可以查看erl_接口模块中的源代码(C语言)。

基本上,它可以归结为长的加法/乘法/除法/减法。有很多优化可以从那里完成(duh),所以不建议您自己滚动。我建议您查看GMP(gnu multi-precision)项目,该项目将静态或动态链接到您的应用程序中。使用起来并不难,但是有一些C++和其他包装器让你更简单地使用它。如果您正在做浮点运算,那么获取MPFR,它可以正确地处理舍入。

Python也可以这样做

基本上,它不是将数字视为自然适合硬件体系结构的位串(例如32位),而是将数字视为32位数字串,然后执行所有算术运算来处理从一个32位数字到另一个32位数字的进位。这还包括在数字变长时分配额外的32位数字。这比看起来容易


例如,99*99比100*100小,100*100等于10000,因此可以假设两个2位数相乘将产生不超过4位数的结果。当每个数字都是32位字时,同样的情况也适用


您可能想尝试在Ruby中实现它,只是为了好玩,使用一些允许固定二进制数量的类型。我相信FixNum类会起作用。

看看C的数字配方书中的第20.6节:


这是一个任意精度数学的伟大实现。如果你想得到幻想,你会制作一个C++类,重载运算符,然后实现这些函数。或者你可以直接打电话给他们。

没错,我很快就会看源代码(我希望是Ruby的源代码)。不过,如果我已经对这个过程的工作方式有了合理的想法,那我就可以更好地适应这一天了。谢谢你,但我想自己动手并对其进行优化:-)这是一个私人项目,我想学习。一旦我这样做了,如果我的尝试失败,我可能会切换到一个做得更好的库。我还将检查GMP。我将“它归结为长加法”误解为长整数加法,仍然留下检测溢出的问题。大多数学生都会指出长加法实际上是他们在课堂上学习的一种算法,这让我明白了一点:-)“当每个数字都是32位字时,同样的情况也适用。”换句话说,算术是在4294967295的基础上完成的,两个值的乘积总是适合于这些值的组合长度。很不错的!我发现这被称为“任意精度算术”,在这里得到了很好的回答;特别有用的是来自miked的链接;多好的资源啊!谢谢你和+1:-)