为什么numpy.arrange中有一行越界了?

ozxc1zmp  于 2023-04-06  发布在  其他
关注(0)|答案(1)|浏览(118)

我写了这段代码却意外地遇到了

for i in range(9):
    x = np.arange(i+0.8, i+1.3, 0.1)
    print(i, x)

这是输出

0 [0.8 0.9 1.  1.1 1.2]
1 [1.8 1.9 2.  2.1 2.2]
2 [2.8 2.9 3.  3.1 3.2]
3 [3.8 3.9 4.  4.1 4.2]
4 [4.8 4.9 5.  5.1 5.2]
5 [5.8 5.9 6.  6.1 6.2]
6 [6.8 6.9 7.  7.1 7.2]
7 [7.8 7.9 8.  8.1 8.2 8.3]
8 [8.8 8.9 9.  9.1 9.2]

为什么第七排是这样的?
为什么在第七排?

nimxete2

nimxete21#

增加0.1不是一个好主意

一般来说,十进制小数不能很好地适应二进制浮点格式。

尝试从整数开始,然后除以10

for i in range(9):
    x = np.arange(10*i+8, 10*i+13, 1) / 10
    print(i, x)

结果

0 [0.8 0.9 1.  1.1 1.2]
1 [1.8 1.9 2.  2.1 2.2]
2 [2.8 2.9 3.  3.1 3.2]
3 [3.8 3.9 4.  4.1 4.2]
4 [4.8 4.9 5.  5.1 5.2]
5 [5.8 5.9 6.  6.1 6.2]
6 [6.8 6.9 7.  7.1 7.2]
7 [7.8 7.9 8.  8.1 8.2]
8 [8.8 8.9 9.  9.1 9.2]

始终尝试使用整数进行循环控制等。
您可以通过添加“一点额外的”来捏造小数的内容,但一般来说,这只会导致以后难以发现的错误。

快速演示

print(0.1+0.2 == 0.3)

您可能认为这应该是True,但实际上是False
这是因为存在微小的差异,这是由于试图用二进制表示舍入小数时的舍入误差。

print(0.1+0.2 -0.3)

5.551115123125783e-17

相关问题