2011-03-01 55 views
5

Gerçekten basit ve aptal bir soru için özür dilerim; Ancak, neden bu iki durum için gösterilen hassasiyette bir fark var?Python dizisinde kayan nokta hassaslığı

1)

>> test = numpy.array([0.22]) 
>> test2 = test[0] * 2 
>> test2 
0.44 

2)

>> test = numpy.array([0.24]) 
>> test2 = test[0] * 2 
>> test2 
0.47999999999999998 

Ben 64 bit linux üzerinde python2.6.6 kullanıyorum. Yardımlarınız için şimdiden teşekkür ederiz.

Bu aynı zamanda tutun farklı sayılardır ve farklı sayılar farklı yuvarlama etkileri olduğundan piton

>>> t = [0.22] 
>>> t 
[0.22] 

>>> t = [0.24] 
>>> t 
[0.23999999999999999] 
+2

- "gizemli yollarla"). Bir çok sorudan kurtulup bir tanesine yerleşemiyorum. – delnan

+1

Buna cevabım Python'a özgü olduğundan (artı benim cevabım :)), bunu bir ikişer kopyalayamam. – Zooba

cevap

6

bir liste için tutmak gibi görünüyor.

(sağ taraftaki aşağı İlgili sorulardan Pratik herhangi yuvarlama etkilerinden kendilerini nedenini açıklayacağız.)


Tamam, biraz daha ciddi bir cevap.

>>> t = numpy.array([0.22]) 
>>> t[0] 
0.22 


>>> t = numpy.array([0.24]) 
>>> t[0] 
0.23999999999999999 

Python bunu otomatik olarak yapmaz oysa:

>>> t = 0.22 
>>> t 
0.22 

>>> t = 0.24 
>>> t 
0.24 

yuvarlama hatası numpy en azdır "eps" değer O numpy bir dizideki sayıların bazı dönüşümü veya hesaplama yapar görünür

>>> abs(numpy.array([0.24])[0] - 0.24) < numpy.finfo(float).eps 
True 

>>> numpy.array([0.24])[0] == 0.24 
True 

Ancak mantık Python'ın 0.24 'olarak görüntüler ve nu: eşit olarak muamele edilmiş (ve aslında, o) gerektiği ima float için mpy Python'un varsayılan float.__repr__ yöntemi (, oldukça yeni bir değişiklik oldu, IIRC) alt hassasiyet kullanması nedeniyle is yapmaz:

işi yüzen nasıl
>>> str(numpy.array([0.24])[0]) 
0.24 

>>> '%0.17f' % 0.24 
'0.23999999999999999' 
+0

Garip ... Python yüzerleri C iki katına çıkmış olsa da, herhangi bir farklılık olmamalıdır. NumPy, garip bir nedenden ötürü tek bir hassasiyet (C şamandırası) kullanmıyorsa. – delnan

+1

Numpy olmasa bile, python aynı değeri yaparsa, eğer değer bir listede bulunuyorsa, '>>> t = [0.22]' '>>> t' '[0.22]' '>>> t = [0.24]' '>>> t' '[0.239999999]' – Eric

+2

@Eric Bunu denediğimde bu etkiyi görmedim, ancak cevap kesinlikle 'numpy.float64 .__ repr__', '% 0 #' da yüksek bir doğruluk kullanıyor 'python' float .__ repr__'. (Şimdi cevaplarımda var.) – Zooba

İlgili konular