究竟 Ruby 是如何做到这一点的?Jörg 或其他人知道背后发生了什么吗?
不幸的是,我不太懂 C 语言,所以 bignum.c
对我帮助不大。我只是有点好奇,是否有人能用通俗易懂的语言解释一下它使用了什么神奇的算法。
irb(main):001:0> 999**999
这是一个非常大的数字,它有309位数字。在计算机科学中,这种数字通常被称为“巨大整数”或“高精度整数”。它们通常用于需要处理非常大的数字的应用程序,例如密码学和大数据处理。
究竟 Ruby 是如何做到这一点的?Jörg 或其他人知道背后发生了什么吗?
不幸的是,我不太懂 C 语言,所以 bignum.c
对我帮助不大。我只是有点好奇,是否有人能用通俗易懂的语言解释一下它使用了什么神奇的算法。
irb(main):001:0> 999**999
这是一个非常大的数字,它有309位数字。在计算机科学中,这种数字通常被称为“巨大整数”或“高精度整数”。它们通常用于需要处理非常大的数字的应用程序,例如密码学和大数据处理。
具体而言,在Ruby中,Integer
实际上是一个从未被实例化的抽象类。相反,它有两个子类 Fixnum
和 Bignum
,并且数字根据其大小自动在它们之间转换。在MRI和YARV中,Fixnum
可以容纳31或63位带符号整数(有一个位用于标记),具体取决于机器的本地字长。在JRuby中,即使在32位机器上,Fixnum
也可以容纳完整的64位带符号整数。
最简单的操作是两个数字相加。如果查看在 YARV 的 bignum.c 中的 +
或者说 bigadd_core
的实现,它也不太难懂。我也无法阅读 C 语言,但你可以清楚地看到它如何循环遍历每个单独的数字。
23*45
,即使我们的数字系统只从0
到9
,只需要使用多个数字。在计算机上也可以做到同样的事情,只不过使用的数字系统从0
到4294967296
。 - Jörg W Mittag