Python 包含标量的numpy数组操作中的取消

Python 包含标量的numpy数组操作中的取消,python,numpy,numeric,rounding,floating-accuracy,Python,Numpy,Numeric,Rounding,Floating Accuracy,我使用的是NumPy版本1.7.1。 现在我遇到了一个奇怪的取消我不明白: >>> import numpy as np >>> a = np.array([ 883, 931, 874], dtype=np.float32) 数学上a+0.1-a应该是0.1。 现在让我们计算 此表达式以及绝对和相对误差: >>> a+0.1-a array([ 0.09997559, 0.09997559, 0.09997559], dtype=

我使用的是NumPy版本1.7.1。 现在我遇到了一个奇怪的取消我不明白:

>>> import numpy as np
>>> a = np.array([ 883,  931,  874], dtype=np.float32)
数学上
a+0.1-a
应该是
0.1
。 现在让我们计算 此表达式以及绝对和相对误差:

>>> a+0.1-a
array([ 0.09997559,  0.09997559,  0.09997559], dtype=float32)
>>> (a+0.1-a)-0.1
array([ -2.44155526e-05,  -2.44155526e-05,  -2.44155526e-05], dtype=float32)
>>> ((a+0.1-a)-0.1) / 0.1
array([-0.00024416, -0.00024416, -0.00024416], dtype=float32)
>>> a+np.array((0.1,)*3)-a
array([ 0.1,  0.1,  0.1])
>>> (a+np.array((0.1,)*3)-a)-0.1
array([  2.27318164e-14,   2.27318164e-14,   2.27318164e-14])
第一个问题:这是一个相当高的绝对和相对误差,这只是灾难性的抵消,不是吗

第二个问题:当我使用数组而不是标量时,NumPy能够以更高的精度进行计算,请参见相对误差:

>>> a+0.1-a
array([ 0.09997559,  0.09997559,  0.09997559], dtype=float32)
>>> (a+0.1-a)-0.1
array([ -2.44155526e-05,  -2.44155526e-05,  -2.44155526e-05], dtype=float32)
>>> ((a+0.1-a)-0.1) / 0.1
array([-0.00024416, -0.00024416, -0.00024416], dtype=float32)
>>> a+np.array((0.1,)*3)-a
array([ 0.1,  0.1,  0.1])
>>> (a+np.array((0.1,)*3)-a)-0.1
array([  2.27318164e-14,   2.27318164e-14,   2.27318164e-14])
我想这只是
0.1
的数字表示


但是,如果使用标量而不是
a+0.1-a
中的数组,为什么NumPy不能以同样的方式处理这个问题呢

如果使用双精度,场景会发生变化。您得到的是单精度(
np.float32
):


使用<代码> NP.数组((0.1,* 3))在表达式的中间把所有的东西都转成了代码> FulAT64 64 /代码>,这解释了第二个结果的更高精度。我知道numpy不能在没有指示的情况下,只接受

a+0.1-a
中的64位。