2015-04-07 30 views
8

Şu anda python programımda çok küçük sayılarla çalışıyorum, ör.Python'da çok küçük numaraların işlenmesi

x = 200 + 2e-26 

bir çözüm benim şamandıra değerinin aralığını artacağını logaritmik değerleri ile çalışmaktır. Sorun şu ki, bu değerlerle bir fft yapmak zorundayım ve bu nedenle logaritmik yaklaşımı kullanmak mümkün değildir (ve Decimal -module ne de kullanılarak). Bu sorunu çözmenin başka bir yolu var mı?

Düzenleme: Sorunum decimal modülüyle: Hayali değerleri nasıl ele alabilirim? a = Decimal(1e-26)+Decimal(1e-26*1j) ve a = Decimal(1e-26)+Decimal(1e-26)*1j çalıştı ve her iki şekilde başarısız oldu (istek üzerine hata). numpy daha ondalık türlerini (ve aynı zamanda karmaşık sürümleri) desteklerken

+3

Ondalık modülünde sorun nedir? –

+0

Karmaşık sayılar için kullanamam, ben a = Ondalık (1e-26) + Ondalık (1e-26 * 1j) 've' a = Ondalık (1e-26) + Ondalık (1e-26) * ile denedim 1j'. Başka bir yolu var mı? –

+0

Sorun, daha büyük sayıların üzerinde çok küçük sayılara sahip olduğun ve küçük sayının sadece hassaslığın sonunda düştüğü gibi değil mi? Büyük sayıyı normalize edebilir misin? – dhke

cevap

1

, onlar yardım etmez:

>>> 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 

nedeni explained here geçerli: Dahili olarak, numpy 80 bit kullanır sadece 63 destekler 63 bit mantis demektir/3 = 21 basamak.

İhtiyacınız olan gerçek bir 128bit float türü like the one from boost.

Bu tür bir erişim sağlayabilecek Boost.Python module'u deneyin. Bu işe yaramazsa, kendi sarmalayıcı sınıfınızı C++ 'da explained here olarak yazmanız gerekir.

2

mpmath package'u denemeyi düşünün.

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

Çoğunlukla doğru ve documentation karmaşık sayılar, daha fazla ayrıntı işleyebilir.

+0

Maalesef, burada bir FT'nin nasıl yapılacağını göremiyorum, numpy-fft denerken, bir hata alıyorum. –