2013-10-15 5 views
12

Il fatto che Python sia scritto in C ed è in realtà un programma in C mi ha fatto riflettere su come vengono gestiti i numeri decimali.Come C implementa l'assegnazione Python di grandi numeri

Come un programma C implementa l'assegnazione della variabile Python di un numero decimale molto grande (maggiore di int o lungo)?

Ad esempio:

a=10000... # a=(10^1000) 

durante l'esecuzione in pitone So che il valore è così grande che ci vogliono molte parole nella memoria, in modo che il programma di C fa, ovviamente, che, ma come?

Ogni variabile in C ha un tipo, ma il codice compilato C non sa quanto sarà grande il numero.

In che modo il programma (python) C gestisce tale assegnazione? (e le operazioni su tali variabili)

+1

Cosa ti fa pensare che il runtime di Python assegni il valore a una variabile C? – geoffspear

+0

Domanda interraziale ma non sono sicuro che sia il caso, vedere Daenyth [post] (http://stackoverflow.com/a/6101453/1982962) e Duncan [post] (http://stackoverflow.com/a/ 6101687/1982962) –

+0

per favore, sii più specifico sui grandi numeri decimali sul titolo della tua domanda – milton

risposta

5

Ecco la C struct che viene utilizzato in CPython 2.7.5 per rappresentare un intero lungo:

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

Se vuoi esplorare ulteriormente questo aspetto, download the source code e prendere uno sguardo ai seguenti file:

./Include/longintrepr.h 
./Include/longobject.h 
./Objects/longobject.c 

Questo vi dirà ogni dettaglio che si possa desiderare di conoscere. :)

+0

il tuo link per il download non funziona più –

+0

@PranavRaj: corretto. – NPE

-1

Python può avere un'implementazione di gran numero per motivi di prestazioni, ma potrebbe utilizzare qualsiasi libreria di precisione arbitraria di terze parti, come ad esempio GMP.