我试图使用numpy.divmod
非常大的整数,但我注意到一个奇怪的行为。在大约2**63 ~ 1e19
(这应该是int
python 3.5+ 中通常的内存表示的限制)时,会发生这种情况:
from numpy import divmod
test = 10**6
for i in range(15,25):
x = 10**i
print(i, divmod(x, test))
15 (1000000000, 0)
16 (10000000000, 0)
17 (100000000000, 0)
18 (1000000000000, 0)
19 (10000000000000.0, 0.0)
20 ((100000000000000, 0), None)
21 ((1000000000000000, 0), None)
22 ((10000000000000000, 0), None)
23 ((100000000000000000, 0), None)
24 ((1000000000000000000, 0), None)
不知何故,商和余数可以正常工作,直到2**63
,然后有一些不同的东西。
我的猜测是int
表示是“矢量化的”(即BigInt
在 Scala 中,作为 的小端序Seq
)Long
。但是,作为 的结果,我期望divmod(array, test)
有一对数组:商数组和余数数组。
我对这个功能一无所知。内置 divmod 不会发生这种情况(一切都按预期工作)
为什么会这样?它与int
内部表示有关吗?
详细信息:numpy 版本 1.13.1,python 3.6