2015-04-07 37 views
8

Attualmente sto lavorando con numeri molto piccoli nel mio programma python, ad es.Gestione di numeri molto piccoli in python

x = 200 + 2e-26 

Una soluzione è lavorare con valori logaritmici che aumenterebbero l'intervallo del mio valore float. Il problema è che devo fare un fft anche con questi valori, e quindi usare l'approccio logaritmico non è utilizzabile (e neanche usando il modulo Decimal). C'è un altro modo per risolvere questo problema?

Modifica: Il mio problema con il modulo decimal è: Come posso gestire i valori immaginari? Ho provato a = Decimal(1e-26)+Decimal(1e-26*1j) e a = Decimal(1e-26)+Decimal(1e-26)*1j, ed entrambi i modi non sono riusciti (errore su richiesta).

+3

Cosa c'è di sbagliato nel modulo 'decimale'? –

+0

Non posso usarlo per numeri complessi, ho provato con 'a = Decimal (1e-26) + Decimal (1e-26 * 1j)' e 'a = Decimal (1e-26) + Decimal (1e-26) * 1j'. C'è un altro modo? –

+0

Il problema non è forse il fatto che si aggiungono numeri molto piccoli in cima a numeri più grandi e il numero ridotto si riduce semplicemente alla fine della precisione? Puoi normalizzare il grande numero di distanza? – dhke

risposta

1

Mentre numpy supporta più tipi di decimali (e anche le versioni complesse), non aiutano:

>>> import numpy 
>>> numpy.longfloat 
<type 'numpy.float128'> 
>>> a = numpy.array([200, 2e-26], dtype=numpy.longfloat) 
>>> a 
array([ 200.0, 2e-26], dtype=float128) 
>>> a.sum() 
200.0 
>>> a = numpy.array([200, 2e-26], dtype=numpy.longdouble) 
>>> a.sum() 
200.0 

La ragione è explained here: Internamente, numpy utilizza 80 bit il che significa 63 bit mantissa che supporta solo 63/3 = 21 cifre.

Quello che ti serve è un vero tipo di galleggiante a 128 bit like the one from boost.

Provare il Boost.Python module che potrebbe consentire l'accesso a questo tipo. Se ciò non funziona, dovrai scrivere la tua classe wrapper in C++ come explained here.

2

Provare a provare lo mpmath package.

>>> from mpmath import mpf, mpc, mp 
>>> mp.dps = 40 
>>> mpf(200) + mpf(2e-26) + mpc(1j) 
mpc(real='200.0000000000000000000000000200000000000007', imag='1.0') 

quasi sempre precisa e in grado di gestire numeri complessi, maggiori dettagli nel documentation.

+0

Purtroppo non riesco a vedere come fare un FT qui, quando provo il numpy-fft, ottengo un errore. –

Problemi correlati