包括s的numpy数组操作中的取消

2024-04-19 04:48:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用的是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)

第一个问题:这是一个相当高的绝对和相对误差,这只是灾难性的取消,不是吗?你知道吗

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

>>> 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不能以同样的方式处理这个问题呢?你知道吗


Tags: import版本numpy表达式asnp精度数学
1条回答
网友
1楼 · 发布于 2024-04-19 04:48:25

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

a = np.array([ 883,  931,  874], dtype=np.float64)

a+0.1-a
# array([ 0.1,  0.1,  0.1])

((a+0.1-a)-0.1) / 0.1
# array([  2.27318164e-13,   2.27318164e-13,   2.27318164e-13])

在表达式中间使用np.array((0.1,)*3)将所有内容都转换为float64,这就解释了第二个结果的更高精度。你知道吗

相关问题 更多 >