Ruby如何做到这一点?约尔格或其他任何人都知道幕后发生了什么吗?

不幸的是我不太了解C,所以 bignum.c 对我几乎没有帮助。我只是有点好奇,有人可以用简单的英语来解释其使用的任何奇迹算法背后的理论。

irb(main):001:0> 999**999

最佳答案

简单:从一年级开始,它就以与您相同的方式进行操作。除非它不以10为基数进行计算,否则以40亿为基数(并进行更改)进行计算。

考虑一下:在我们的数字系统中,我们只能表示从09的数字。那么,如何计算6+7而不会溢出呢?简单:我们实际上确实溢出!我们无法将6+7的结果表示为09之间的数字,但是我们可以溢出到下一个位置,并将其表示为09之间的两个数字:3×100 + 1×101。如果要添加两个数字,请从右侧按数字方式添加它们,并向左溢出(“进位”)。如果要将两个数字相乘,则必须将一个数字的每个数字分别与另一个数字相乘,然后将中间结果相加。

BigNum算术(这种数字通常比本地机器号大的算术)通常以相同的方式工作。除了基数不是10且不是2之外-它是 native 整数的大小。因此,在32位计算机上,它将是232或4×294×967×296。

具体来说,在Ruby中,Integer实际上是一个永远不会被抽象的抽象类。相反,它具有两个子类FixnumBignum,数字根据它们的大小自动在它们之间迁移。在MRI和YARV中,Fixnum可以容纳31或63位带符号整数(用于标记的位为1位),具体取决于机器的原始字长。在JRuby中,即使在32位计算机上,一个Fixnum也可以容纳完整的64位带符号整数。

最简单的操作是将两个数字相加。而且,如果您查看YARV的bignum.c+或更确切地说bigadd_core的实现,那么遵循它也不错。我也看不懂C,但是您可以清楚地看到C如何遍历各个数字。

关于ruby - Ruby的任意精度算法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2867288/

10-12 19:30