Python在进行数学计算时表现奇怪,这是为什么?

3

今天我很无聊,所以开始写了一些几分钟的代码来消磨时间。不过我想知道 x 的 x 次方和 x 本身之间的函数关系,所以我写了以下代码。

x = np.arange(1,21,1)
y = []
for i in x:
    y.append(len(str(i**i)))
plt.plot(x,y,'b')

看起来非常简单,绝对不可能出错的,是吗?事实上没有错误,但输出的图像却像这样。

Output image

这太奇怪了,所以我写了以下代码进行验证,print(len(str(20**20))),但这是正常的,并给出了27的结果。

按理说,这个函数的曲线应该一路上升,但在1620处存在严重问题。 这是Python的问题吗?为什么会发生这种情况?


1
你为什么使用 np.arange() 而不是 list(range(1, 21))?如果使用普通列表,它是否有效? - Barmar
如果你执行 print(y),你会看到什么? - Barmar
普通的列表可以工作,因为Python中的普通整数不会溢出,感谢Barmar。 - lei37927
3个回答

1

好问题 - x 中的值的数据类型为 np.int64。当您执行 16**16 时,会溢出 64 位。但是 Python 的内置 int 数据类型没有这样的限制。因此,在转换之前,您应该将数据转换为 int 类型:

y.append(len(str(int(i)**int(i))))

或者将x定义为一个整数数组:

x = list(range(1, 21))

这正是所发生的事情,谢谢 Stephen。 - lei37927

0

np.arange()x[i] 的 dtype 设置为 int64,对于大值会溢出。使用 list(range(1,21)) 可以解决这个问题。


那正是发生的事情,谢谢Ishan。 - lei37927
我一开始不理解为什么会溢出,然后才意识到我将其误读为“i*i”。 - Barmar

0

numpy中的数据类型与Python中的不同。 它会因为在C中是int而溢出。


那正是发生的事情,谢谢 Delta。 - lei37927

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接