在C,Python和Scheme中使用factorial程序进行一些随机实验.我发现了这个事实:
在C中,使用'unsigned long long'数据类型,我可以打印的最大因子是65.这是'9223372036854775808',这里指定的是19位数 .
在Python中,我可以找到一个大到999的数字的阶乘,它由大量的数字组成,远远超过19.
CPython如何实现这一目标?它是否使用像' octaword ' 这样的数据类型?
我可能会遗漏一些基本事实.所以,我会很感激一些见解和/或参考阅读.谢谢!
更新:谢谢大家的解释.这是否意味着,CPython正在使用GNU多精度库(或其他类似的库)?
更新2:我在源代码中寻找Python的'bignum'实现.到底在哪里?它位于http://svn.python.org/view/python/trunk/Objects/longobject.c?view=markup.谢谢Baishampayan.
看看Python源代码,似乎这个long类型(至少在Python 3之前的代码中)是在longintrepr.h中定义的- 就像这样 -
/* Long integer representation.
The absolute value of a number is equal to
SUM(for i=0 through abs(ob_size)-1) ob_digit[i] * 2**(SHIFT*i)
Negative numbers are represented with ob_size < 0;
zero is represented by ob_size == 0.
In a normalized number, ob_digit[abs(ob_size)-1] (the most significant
digit) is never zero. Also, in all cases, for all valid i,
0 <= ob_digit[i] <= MASK.
The allocation function takes care of allocating extra memory
so that ob_digit[0] ... ob_digit[abs(ob_size)-1] are actually available.
CAUTION: Generic code manipulating subtypes of PyVarObject has to
aware that longs abuse ob_size's sign bit.
*/
struct _longobject {
PyObject_VAR_HEAD
digit ob_digit[1];
};
Run Code Online (Sandbox Code Playgroud)
long然后通过创建一个像这样的新类型PyLongObject 在longobject.h中定义该类型的实际可用接口-
typedef struct _longobject PyLongObject;
Run Code Online (Sandbox Code Playgroud)
等等.
在longobject.c中发生了更多的事情,您可以查看这些内容以获取更多详细信息.