【发布时间】:2010-10-26 10:15:12
【问题描述】:
在用 C、Python 和 Scheme 中的阶乘程序进行一些随机实验时。我遇到了这个事实:
在 C 中,使用“unsigned long long”数据类型,我可以打印的最大阶乘为 65。即“9223372036854775808”,即指定的 19 位 here。
在 Python 中,我可以找到一个大到 999 的数字的阶乘,它由大量数字组成,远远超过 19。
CPython 如何实现这一点?它是否使用像 'octaword' 这样的数据类型?
我可能在这里遗漏了一些基本事实。因此,我将不胜感激阅读一些见解和/或参考资料。谢谢!
更新:谢谢大家的解释。这是否意味着,CPython 正在使用 GNU 多精度库(或其他类似库)?
更新 2:我在源代码中寻找 Python 的“bignum”实现。它究竟在哪里?它在这里http://svn.python.org/view/python/trunk/Objects/longobject.c?view=markup。谢谢白沙帕扬。
【问题讨论】:
-
我想一个更好的问题可能是,Python 如何在不影响性能的情况下使用 bignums?它是否使用 32 位整数并在需要时将它们提升为大数?这是否意味着要检查每个积分运算?
-
CPython 2.x 有 int 和 long。 int 就像 C 的 int,long 是 bignum。它会在需要时进行推广。从 CPython 3.x 开始,它们合并为单一类型并且性能较慢。
-
@kcwu,仅仅因为它们是一种数据类型而不是两种数据类型,并不意味着性能更差。