我有一个NumPy数组,其中f**2
中的条目与f[i]**2
中的条目不同,但只针对某些特定值.
import numpy as np
np.set_printoptions(precision = 16)
f = np.array([ -40709.6555510835, -40708.6555510835, -33467.081758611654, -27653.379955714125])
f2 = f**2
# f2 = np.power(f,2)
print("outside loop", np.abs(f[1]**2 - f2[1]), np.abs(1.0 - f2[1] / f[1]**2), f.dtype, f[1].dtype, f2.dtype, f2[1].dtype)
for i, val in enumerate(f):
print("inside loop", i, np.abs(val**2 - f2[i]), np.abs(1.0 - f2[i] / val**2), val.dtype, f2.dtype, f2[i].dtype)
生成输出:
outside loop 2.384185791015625e-07 2.220446049250313e-16 float64 float64 float64 float64
inside loop 0 0.0 0.0 float64 float64 float64
inside loop 1 2.384185791015625e-07 2.220446049250313e-16 float64 float64 float64
inside loop 2 0.0 0.0 float64 float64 float64
inside loop 3 0.0 0.0 float64 float64 float64
我确实注意到,这是一个在epsilon量级上的相对错误.
在f2
的定义中使用np.power
而不是**
时,这个问题就不存在了.
即便如此,为什么f[i]**2
不等于第i
个值f**2
(即使只针对f
中的某些值).
我使用的是python3.10.6和最新的NumPy 1.26.4.
编辑:
根本问题体现在:
import numpy as np
f = np.array([-40708.6555510835])
print((f[0])**2 - (f**2)[0])
它显示的值为
-2.384185791015625e-07
我想知道为什么那个特定的数字会有这个特定的问题.如果您想要确认,或者想try f
的不同值,请查看这个demo.