2009-05-15 7 views
2

C、Python、Schemeの階乗プログラムでランダムな実験をしながら。Pythonなどの言語は、CのIntegralデータ制限をどのように克服しますか?

Cでは、 'unsigned long long'データ型を使用して、Iが印刷できる最大の階乗は65で、 '9223372036854775808'は、指定されたとおりに19桁の数字です。hereです。 Pythonで

、私はどのようにCPythonのは、これを達成ん、桁数が多いから構成されている999のような大きなとして19

よりもはるかに多くの数の階乗を見つけることができますか?それは 'octaword'のようなデータ型を使用していますか?

私はここでいくつかの基本的な事実を見逃しているかもしれません。だから、私はいくつかの洞察や読書の参考に感謝します。ありがとう!

更新:説明をいただきありがとうございます。つまり、CPythonはGNUの多精度ライブラリ(または他の同様のライブラリ)を使用していますか?

更新2:ソースでPythonの「bignum」実装を探しています。正確にそれはどこですか?ここはhttp://svn.python.org/view/python/trunk/Objects/longobject.c?view=markupです。ありがとうBaishampayan。

+2

私はより良い質問かもしれないが、Pythonはbignumをどのように使用してパフォーマンスを低下させることなく使用するのだろうか?それは32ビットintを使用し、必要なときにbignumsにそれらを促進しますか?これは積分演算のたびにチェックを意味しますか? –

+0

CPython 2.xにはintとlongがあります。 intはCのintと似ていて、longはbignumです。それは必要なときに促進します。 CPython 3.x以来、彼らはシングルタイプとしてマージし、より遅い性能を持っています。 – kcwu

+0

@kcwu、2つではなく1つのデータ型だからといって、パフォーマンスが悪いというわけではありません。 –

答えて

9

任意精度の精度と呼ばれています。 http://en.wikipedia.org/wiki/Arbitrary-precision_arithmetic

+1

GMP(http://gmplib.org/)のようなライブラリを使って、純粋なCで任意の精度演算を行うことは完全に可能です。それを使用する階乗プログラムを書くことはかなり簡単です。 –

+0

いつ私はそれが不可能であったと言いましたか? – sykora

+0

私はそれを言ったことを暗示するつもりはありませんでした。 –

1

Pythonは、必要に応じて割り当てられた "数字"(基本は2の累乗)の配列で、必要なだけ多くの整数(すべてint sのPython 3)を割り当てます。

3

オクタワードではありません。任意精度の数値を格納するためにbignum構造を実装しました。

4

Cのintなどのデータ型は、プロセッサでサポートされているデータ型に直接(多かれ少なかれ)マップされています。したがって、Cのintの制限は、基本的にプロセッサのハードウェアによって課される制限です。

しかし、自分自身のintデータタイプをソフトウェアで実装することはできます。たとえば、基本的な表現として数字の配列を使用できます。あなたが好きなあなたは限り、あなたはメモリを実行しないように、できるだけ多くの数字を含むこのクラスや店舗の整数を使用することができることにやるたら

class MyInt { 
    private int [] digits; 
    public MyInt(int noOfDigits) { 
     digits = new int[noOfDigits]; 
    } 
} 

:このようなことがあります。

多分、Pythonは仮想マシンの内部でこれをやっています。詳細を知るには、任意精度の算術演算でthis articleを読んでみてください。

+1

Frederickの権利ですが、このコードは推奨されたデザインではなく、概念の証明と見なすべきです。 GMP(http://gmplib.org/)やBigIntegerのような実際の精度ライブラリは、より効率的に動作し、ベース10に不必要に依存しません。 –

+0

BCD算術演算をネイティブにサポートするプロセッサでは、(コードの人間とのやり取りの部分を簡素化するために、基数10のbignumを行うのに共通しています。 'コース、これはBCDタイプをサポートするアセンブリまたはコンパイラが必要です... – dmckee

6

Pythonのソースコードを見ると、(少なくとも前のPython 3のコードで)longタイプはこのようlongintrepr.hに定義されていると思われる - longタイプの

/* 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]; 
}; 

実際の使用可能なインタフェースは、次にですその上

typedef struct _longobject PyLongObject; 

そして - このような新しいタイプのPyLongObject型を作成することによりlongobject.hで定義されています。

longobject.cの中にはさらに多くのことが起こっています。詳しくはそれらをご覧ください。

+0

ありがとう! longobject.cそれは:)私はちょうどソースのPython /サブディレクトリを見て、そのすべてのオブジェクトはPythonの事実が不足している! –

関連する問題