2011-09-28 11 views
12

Dopo una lettura approfondita di Python decimal module documentation, mi trovo ancora perplesso per ciò che accade quando divido un decimale.La divisione dei decimali produce risultati non validi in Python 2.5 - 2.7

In Python 2.4.6 (senso):

>>> import decimal 
>>> decimal.Decimal(1000)/10 
Decimal("100") 

In Python 2.5.6, Python 2.6.7, 2.7.2 e Python (sconcertante):

>>> import decimal 
>>> decimal.Decimal(1000)/10 
Decimal('0.00000-6930898827444486144') 

più confusa tuttavia, questo risultato non ha nemmeno sembra essere valido:

>>> decimal.Decimal('0.00000-6930898827444486144') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/decimal.py", line 548, in __new__ 
    "Invalid literal for Decimal: %r" % value) 
    File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/decimal.py", line 3844, in _raise_error 
    raise error(explanation) 
decimal.InvalidOperation: Invalid literal for Decimal: '0.00000-6930898827444486144' 

il risultato è lo stesso utilizzando decimal.Decimal(1000)/decimal.Decimal(10), quindi non è un problema con l'utilizzo di un int come il divisore.

Parte del problema è chiaramente in giro per la precisione:

>>> decimal.Decimal("1000.000")/decimal.Decimal("10.000") 
Decimal('0.00000-6930898827444486144') 
>>> decimal.Decimal("1000.000")/decimal.Decimal("10") 
Decimal('0.000200376420520689664') 

Ma ci dovrebbe essere ampio precisione decimal.Decimal("1000.000") per dividere in modo sicuro 10 e ottenere una risposta che è, almeno nel campo da baseball a destra.

Il fatto che questo comportamento sia invariato attraverso tre revisioni principali di Python mi dice che non è un bug.

Cosa sto sbagliando? Cosa mi manca?

Come dividere un decimale (a parte usando Python 2.4)?

+0

Anche se non è un bug, _someone_ ha probabilmente aperto un bug report su di esso ad un certo punto negli ultimi 5 anni sul http://bugs.python.org, vorrei dare un'occhiata lì – agf

+0

Buon punto . Ho cercato lì; sono state trovate tutte le mie ricerche che sembravano lontanamente correlate erano http://bugs.python.org/issue7046 e http://bugs.python.org/issue1031480, nessuno dei quali è questo ... –

+3

Funziona bene per me su Ubuntu 11.04 con Python 2.6.6 e 2.7.1+. Potrebbe essere un problema con Macports? – user500198

risposta

7

Dal tuo bug MacPorts, hai installato Xcode 4 e la tua versione di Python 2.7.2 è stata creata con il compilatore C clang, anziché con gcc-4.2. C'è almeno one known problem with building with clang su OS X che è stato corretto in Python successivo al 2.7.2. pubblicazione. Applicare la patch o, meglio, assicurarsi che la build usi gcc-4.2. Qualcosa di simile (non testata!):

sudo bash 
export CC=/usr/bin/gcc-4.2 
port clean python27 
port upgrade --force python27 

prima della costruzione forza lavoro se MacPorts non sovrascrive esso.

UPDATE: La patch richiesta è stata ora applicata ai file di porta macports per Python 2. Vedi https://trac.macports.org/changeset/87442

+0

Penso che questa sia la strada giusta da seguire. Tuttavia, ho provato ad esportare CC, CXX e CPP =/usr/bin/gcc-4.2, ma non ho ancora avuto fortuna. https://trac.macports.org/wiki/UsingTheRightCompiler suggerisce che potrei aver fatto qualche ricerca extra sotto il cofano. Continuerò a lavorare su questo ... –

+2

Per riferimento, il modo di impostare il compilatore che ha funzionato per me era 'configure.compiler gcc-4.2' - vedere https://trac.macports.org/ticket/31444#comment: 8. –

0

Solo per la cronaca: per Python 2.7.3 compilato con clangore (via Homebrew su OS X), questo sembra essere risolto.

Python 2.7.3 (default, Oct 10 2012, 13:00:00) 
[GCC 4.2.1 Compatible Apple Clang 4.1 ((tags/Apple/clang-421.11.66))] on darwin 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import decimal 
>>> decimal.Decimal(1000)/10 
Decimal('100') 
Problemi correlati