2010-09-24 8 views
6

considerare questo codice Python:Ritrattamento del numero in Python?

assert(a > 0) 
assert(b > 0) 
assert(a + b > 0) 

Può la terza asserzione mai fallire? In C/C++, può se la somma supera il valore intero massimo. Come viene gestito in Python?

+5

Si assume che a e b non siano classi con operatori ridefiniti: P – Colin

risposta

9

Dipende dalla versione di Python che si sta utilizzando.

Prima di 2,2 o così, è possibile ottenere uno OverflowError.

La versione 2.2-2.7 promuove la somma a long (precisione arbitraria) se è troppo grande per rientrare in un int.

3.0+ ha solo un tipo intero, che è una precisione arbitraria.

3

Python promuoverà automaticamente gli interi con precisione arbitraria. Se un galleggiante diventa troppo grande, sarà inf. Quindi, questo fallirebbe solo se a e b sono entrambi integri e si esaurisce la memoria.

1

Se a + b è è più grande del valore massimo intero, il risultato sarà un lungo:

>>> import sys 
>>> sys.maxint 
9223372036854775807 
>>> a = sys.maxint 
>>> b = 1 
>>> a + b 
9223372036854775808L # A long 
>>> assert a > 0 
>>> assert b > 0 
>>> assert a + b > 0 
+1

Se è lungo o meno, non importa se l'asserzione passerà. – Zimm3r

-1

Ok la risposta alla tua domanda è generalmente no, se avete a che fare con un gran numero si può avere qualche problemi, di seguito sono dettagli sui grandi numeri di Python.

Vedi anche questo post per informazioni inf (infinito) NaN (non un numero (cioè infinito/infinito = NaN))

Nota: Questo è su una macchina AMD a 32 bit (se pitone dice è intel (si riferisce al fatto che è 32 bit ??)

Python 2.6.2 (r262: 71605, 14 aprile 2009, 22:40:02) [MSC v.1500 32 bit (Intel)] su win32

Il numero massimo di CPython nel modulo matematico (Cib sottostante) dove altrimenti si riverserà o r ritorno inf è 8.2184074615549724e + 309

>>> x = 8.2184074615549724e+309 
>>> x 
8.2184074615549724e+309 
>>> x + 1 
>>> x 
inf 
>>> x = exp(710) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
OverflowError: math range error 

Il numero massimo (pitone può rappresentare) è 1.7976931348623157e + 308 e può essere ottenuto da (probabilmente anche altri modi)

http://docs.scipy.org/doc/numpy/reference/generated/numpy.finfo.html

>>> import numpy 
>>> f = numpy.finfo(float() 
>>> f.max 
1.7976931348623157e+308 

>>> m = f.max 
>>> m1 = m + 100 # supposedly increase the number by 100 
>>> m 
1.7976931348623157e+308 
>>> m1 
1.7976931348623157e+308 
>>> # note how m1 and m are the same number 
>>> m == m1 
True 
>>> 

Credo (ma non lo so) che ciò è dovuto all'uso matematico di una libreria C sottostante http://docs.python.org/library/math.html

Specifico per CPython Il modulo matematico consiste principalmente di involucri sottili attorno alle funzioni matematiche della piattaforma C. Il comportamento in casi eccezionali segue allegato F della norma C99 dove è appropriato. La corrente attuazione solleverà ValueError per operazioni non valide come sqrt (-1.0) o log (0,0) (dove C99 allegato F consiglia segnalazione di operazione non valida o divisione per zero), e OverflowError per risultati che troppopieno (per esempio, exp (1000,0))

modificato nella versione 2.6: comportamento in casi particolari la società si propone di seguire C99 allegato F. nelle versioni precedenti di Python il comportamento in casi particolari era vagamente specified.loosely specificato .

Il numero intero massimo di Python (tipo int) è definito da sys.maxint. La differenza tra il massimo intero e il numero massimo è questo

>>> type(x) 
<type 'float'> 
>>> int_x = int(x) 
>>> type(int_x) 
<type 'long'> 
>>> 

il numero massimo è originariamente un galleggiante ma quando cerchiamo di convertirlo in un numero intero utilizzando int() viene automaticamente convertita nel tipo long perché è su sys.maxintloosely specificato.

+0

Chi mi ha votato, c'è una ragione per cui? Qualcosa che posso aggiustare o imparare? – Zimm3r

+1

Non ti ho votato. Tuttavia, la tua risposta è vaga e probabilmente errata. Python ha essenzialmente gli stessi limiti per 'float' (equivalente al tipo C' double'). –

+0

@Matthew Flaschen Grazie per il feedback, cercherò di aggiungere qualche dettaglio. – Zimm3r