Python 数组中非常小数字的精度丢失

5 投票
1 回答
2513 浏览
提问于 2025-04-17 02:52

我有两个浮点数类型的数组,当我把第一个数组的值赋给第二个数组时,结果会出现四舍五入的情况。下面这段简单的代码展示了这个问题,并且排除了只是数字表示的问题。(我把我的代码片段简化了一下,方便阅读,但本质上是一样的)

X = zeros((2,2))
Y = zeros((2,2))
Z = X            #a shorter way of making a new matrix, equal to X...
X[0,0] = Y[0,0]
Z[0,0]=0
print Y[0,0]
print X[0,0]
print type(Y[0,0])
print type(X[0,0])
if X[0,0]==Y[0,0]:
   print'they are equal'
else:
   print'they are NOT equal'

我运行了这段小代码,测试了所有的系数,所有的输出结果都类似于这个:

1.90897e-14
0
<type 'numpy.float64'>
<type 'numpy.float64'>
they are NOT equal

我觉得X数组可能是另一种类型,但它是用相同的方式创建的,都是用zeros()函数生成的,类型也是标准的(float64)

编辑:这些数组是用以下方式初始化的

X = zeros((2,2), dtype=float64)
Y = zeros((2,2), dtype=float64)

我在上面的例子中还加了一个额外有用的打印输出。

编辑:添加了有问题的代码行,找到了问题所在。

1 个回答

3

真的很确定 X 是一个 float64 数组吗?如果是的话,我会期待 X[0,0] 的值是 0.0,但你看到的是 0,这看起来更像是一个整数。

>>> Xf = arange(10,dtype=float64)
>>> Xi = arange(10)
>>> Xf[0]
0.0
>>> Xi[0]
0
>>> Yf = Xf*0.0
>>> Yf[0]
0.0
>>> 
>>> Yf[0] = 1.90897e-14
>>> Yf[0]
1.9089700000000001e-14
>>> Xf[0] = Yf[0]
>>> Xf[0]
1.9089700000000001e-14
>>> Xi[0] = Yf[0]
>>> Xi[0]
0

撰写回答