python float vs numpy.float给出不同的答案?

时间:2016-11-28 04:28:56

标签: python numpy

您好我不明白我的代码发生了什么。 numpy.float64的行为方式似乎与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'>

感谢您的帮助。

1 个答案:

答案 0 :(得分: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)))

显然,这些将具有不同的价值(无论您是否实际使用floatnp.float64)。