2015-01-22 8 views
6

Il mio programma calcola la costante matematica e, che è irrazionale. Per fare ciò, avevo bisogno di ottenere fattoriali di numeri molto grandi.Qual è il numero più grande che la classe decimale può gestire?

int non può gestire numeri maggiori di 170 !. (Ho scoperto che il più grande calcolatore di Google in grado di gestire è 170,654259, ma non sono sicuro di come un numero intero non può essere fattorizzato.) float non può gestire anche numeri molto grandi.

Ho calcolato e a 750000 cifre e math.factorial(750000) è un numero grande, incredibile. Eppure, Decimal gestito con apparente facilità.

Quanto può essere grande un numero la maniglia Decimal prima che venga sollevato uno OverflowError? La dimensione è diversa in Python 2 rispetto a Python 3?

+5

'Decimale' non fornisce risposte esatte. –

+1

I numeri interi hanno una precisione infinita in Python, ad es. 'Matematica.fattoriale (170) 'è' 7257415615307998967396728211129263114716991681296451376543577798900561843401706157852350749242617459511490991237838520776666022565442753025328900773207510902400430280058295603966612599658257104398558294257568966313439612262571094946806711205568880457193340212661452800000000000000000000000000000000000000000'. Vedi [come potresti usare 'decimal.Decimal' per calcolare una risposta con precisione arbitraria (ma fissa)] (http://stackoverflow.com/a/347749/4279) – jfs

+0

FWIW, non è così difficile calcolare un gran numero di cifre decimali di e utilizzando l'aritmetica intera. Vedi [here] (http://forums.xkcd.com/viewtopic.php?t=14661&p=3066871#p3066964) per esempio codice in Python e C. –

risposta

6

Qual è il numero più grande che può gestire la classe Decimal?

L'entità maggiore è infinito:

>>> from decimal import Decimal 
>>> Decimal('Inf') 
Decimal('Infinity') 

Il maggior numero finito rappresentabile in una determinata piattaforma dipende decimal.MAX_EMAX:

>>> from decimal import Context, MAX_EMAX 
>>> d = Context(Emax=MAX_EMAX, prec=1).create_decimal('9e'+str(MAX_EMAX)) 
>>> d.is_finite() 
True 
>>> d.next_plus() 
Decimal('Infinity') 
>>> d 
Decimal('9E+999999999999999999') 

Il numero di cifre significative dipende decimal.MAX_PREC esempio, a calcolare e con la precisione data:

>>> from decimal import Context 
>>> Context(prec=60).exp(1) 
Decimal('2.71828182845904523536028747135266249775724709369995957496697') 

Le costanti (MAX_EMAX, MAX_PREC) sono rilevanti solo per l'implementazione C. La versione Pure Python può utilizzare valori più grandi:

>>> from decimal import Context, MAX_EMAX 
>>> Context(Emax=MAX_EMAX+1, prec=1).create_decimal('9e'+str(MAX_EMAX+1)) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ValueError: valid range for Emax is [0, MAX_EMAX] 
>>> from _pydecimal import Context, MAX_EMAX 
>>> Context(Emax=MAX_EMAX+1, prec=1).create_decimal('9e'+str(MAX_EMAX+1)) 
Decimal('9E+1000000000000000000') 
1

Dipende dal contesto che si fornisce per l'oggetto decimale. Dal library documentation:

classe decimal.Context (prec = Nessuno, arrotondamento = Nessuno, trappole = Nessuno, bandiere = Nessuno, Emin = Nessuno, Emax = None, capitelli = 1)

Emax e Emin controllano i limiti del tuo decimale. Se l'esponente è maggiore di Emax o inferiore a Emin, ci sarà un segnale di overflow. Puoi vedere i campi in decimal.defaultContext per vedere quali sono per impostazione predefinita o decimal.getContext() per vedere cosa sono in un dato momento.

Modifica: come @davidism ha sottolineato che non si ottengono risposte esatte dai calcoli decimal. La precisione predefinita del modulo è 28. Quindi tutti i numeri interi fino a 99999999999999999999999999999999 (28 NINE) possono essere rappresentati esattamente e numeri superiori potrebbero essere arrotondati.

+0

Solo allora genererà un errore di overflow? Quando stavo calcolando e, la mia ventola del computer era rumorosa e il monitor di sistema mostrava che una delle mie CPU era al 100% di utilizzo e che passava ogni 15 minuti circa. Cosa succede se al mio computer viene assegnata un'istruzione intensiva che fa sì che raggiunga la sua temperatura massima? O se il numero è memorizzato nella RAM e la RAM si esaurisce nello spazio? –

+0

memoria insufficiente darebbe un 'MemoryError'. il surriscaldamento non è qualcosa che potrebbe dare alcun segnale in Python per quanto ne so. – M4rtini

+1

il campo 'trap 'determina quali cose causeranno errori e quali cose spazzerà sotto il tappeto. Per impostazione predefinita, gli overflow vengono considerati come errori. Non posso davvero dirti quanto Python si preoccupa dei limiti fisici del tuo computer. Ma se non ti preoccupi troppo dei tuoi dati, ti incoraggio a eseguire alcuni test. – genisage

Problemi correlati