2016-11-28 33 views
0

你好,我不明白我的代碼發生了什麼。 numpy.float64行爲的方式似乎與float不同。python float vs numpy.float給出了不同的答案?

我認爲他們應該給出相同的答案,但他們沒有。 2E-05 VS 0.2

請幫助

主要結果

N = 500.0 
1.0/N*(np.absolute((-1.2e-10 -1e+02j))) = 0.2 
1.0/N*float(np.absolute(-1.2e-10 -1e+02j)) = 0.2 
1.0/float(N*np.absolute(-1.2e-10 -1e+02j)) = 2e-05 
N*np.absolute(-1.2e-10 -1e+02j) = 50000.0 

代碼

print 'N*np.absolute(-1.2e-10 -1e+02j) = ',N*np.abs(-1.2e-10 -1e+02j) 
print 'type(N*np.abs(-1.2e-10 -1e+02j))',type(N*np.abs(-1.2e-10 -1e+02j)) 
print '1/5000 = ',1/5000 
print '' 
print '1.0/N*np.absolute(-1.2e-10 -1e+02j) = ',1.0/N*np.abs(-1.2e-10 -1e+02j) 
print 'type(1.0/N*np.abs(-1.2e-10 -1e+02j))',type(1.0/N*np.abs(-1.2e-10 -1e+02j)) 
print '' 
print '1.0/N(*np.absolute((-1.2e-10 -1e+02j))) = ',1.0/N*(np.abs(-1.2e-10 -1e+02j)) 
print 'type(1.0/N*np.abs(-1.2e-10 -1e+02j))',type(1.0/N*(np.abs(-1.2e-10 -1e+02j))) 
print '' 
print '1.0/N*float(np.absolute(-1.2e-10 -1e+02j)) = ',1.0/N*float(np.abs(-1.2e-10 -1e+02j)) 
print 'type(1.0/N*float(np.absolute(-1.2e-10 -1e+02j)))',type(1.0/N*float(np.absolute(-1.2e-10 -1e+02j))) 
print '' 
print '1.0/float(N*np.absolute(-1.2e-10 -1e+02j)) = ',1.0/float(N*np.abs(-1.2e-10 -1e+02j)) 
print 'type(1.0/float(N*np.abs(-1.2e-10 -1e+02j)))',type(1.0/float(N*np.abs(-1.2e-10 -1e+02j))) 

結果

N*np.absolute(-1.2e-10 -1e+02j) = 50000.0 
type(N*np.abs(-1.2e-10 -1e+02j)) <type 'numpy.float64'> 
1.0/5000 = 0 

1.0/N*np.absolute(-1.2e-10 -1e+02j) = 0.2 
type(1.0/N*np.abs(-1.2e-10 -1e+02j)) <type 'numpy.float64'> 

1.0/N(*np.absolute((-1.2e-10 -1e+02j))) = 0.2 
type(1.0/N*np.abs(-1.2e-10 -1e+02j)) <type 'numpy.float64'> 

1.0/N*float(np.absolute(-1.2e-10 -1e+02j)) = 0.2 
type(1.0/N*float(np.absolute(-1.2e-10 -1e+02j))) <type 'numpy.float64'> 

1.0/float(N*np.absolute(-1.2e-10 -1e+02j)) = 2e-05 
type(1.0/float(N*np.abs(-1.2e-10 -1e+02j))) <type 'float'> 

感謝您的幫助。

回答

0

這是操作順序問題。使用一些額外的括號...

>>> 1.0/N*float(np.absolute(-1.2e-10 -1e+02j)) 
0.2 
>>> 1.0/(N*float(np.absolute(-1.2e-10 -1e+02j))) 
2e-05 
>>> 1.0/N*(np.absolute((-1.2e-10 -1e+02j))) 
0.20000000000000001 
>>> 1.0/(N*(np.absolute((-1.2e-10 -1e+02j)))) 
2.0000000000000002e-05 

基本上,不同的是,您比較:

(1./N) * np.absolute((-1.2e-10 - 1e+02j)) 

有:

1./(N * np.absolute((-1.2e-10 - 1e+02j))) 

很顯然這些都將有不同值(不管您是實際使用float還是np.float64)。

+0

嗨,謝謝但問題仍然存在 – qwaszxee

+0

N * np.absolute(-1.2e-10 -1e + 02j)= 50000.0 float(N * np.abs(-1.2e-10 -1e + 02j)) (N * np.abs(-1.2e-10 -1e + 02j)))= 50000.0 1.0/ 1.0 /(N * float(np.absolute(-1.2e-10 -1e + 02j)))= 2e-05 ' – qwaszxee

+0

@qwaszxee - 我不確定我是否理解這個問題。 N是500,你的複數的大小是由虛數項(~100)支配的,所以你最終得到了500 * 100 = 50000這樣的結果。這對我來說似乎是預期的結果。 – mgilson

相關問題