python float vs numpy.float给出了不同的答案?
问题描述:
你好,我不明白我的代码发生了什么。 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'>
感谢您的帮助。
答
这是操作顺序问题。使用一些额外的括号...
>>> 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
)。
嗨,谢谢但问题仍然存在 – qwaszxee
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
@qwaszxee - 我不确定我是否理解这个问题。 N是500,你的复数的大小是由虚数项(~100)支配的,所以你最终得到了500 * 100 = 50000这样的结果。这对我来说似乎是预期的结果。 – mgilson