gpt4 book ai didi

python - 正数之和得出负数

转载 作者:太空宇宙 更新时间:2023-11-03 15:14:44 26 4
gpt4 key购买 nike

我正在使用 numpy 来执行总是很有趣的“计算邻接矩阵中的三角形”任务。 (Given an nxn Adjacency matrix, how can one compute the number of triangles in the graph (Matlab)?)

给定我的矩阵 A , numpy.matmul()计算 A 的立方没有问题,但是对于大矩阵numpy.trace()返回负数。

我使用 numpy.diagonal() 提取了对角线并使用 math.sum() 对条目进行求和并且还使用 for 循环 - 两者都返回与 numpy.trace() 相同的负数.

尝试 math.fsum()最后返回了(大概是正确的)数字 4,088,103,618——对于 python 和我的 64 位操作系统来说,这似乎是一个很小的数字,特别是因为 python 文档声称整数值是无限的。

这当然是溢出或未定义的行为问题,但是不一致从何而来?我已经在下面的帖子中进行了测试,成功验证了我的系统架构为 64 位,因此 numpy 也应该是 64 位包。 Do I have Numpy 32 bit or 64 bit?

为了可视化求和过程,将打印语句添加到 for 循环中,输出如下所示,并用星号标记感兴趣的行。

.
.
.
adding diag val 2013124 to the running total 2140898426 = 2142911550
adding diag val 2043358 to the running total 2142911550 = 2144954908
adding diag val 2035410 to the running total 2144954908 = 2146990318
adding diag val 2000416 to the running total 2146990318 = -2145976562 *
adding diag val 2062276 to the running total -2145976562 = -2143914286
adding diag val 2092890 to the running total -2143914286 = -2141821396
adding diag val 2092854 to the running total -2141821396 = -2139728542
.
.
.

为什么将 2000416 添加到 2146990318 会产生溢出?总和只有 2148990734——对于 python 来说这是一个非常小的数字!

最佳答案

Numpy 不使用“python 类型”,而是使用 underlying C types您必须指定满足您的需求的内容。默认情况下,整数数组将被赋予“int_”类型,来自文档:

int_ Default integer type (same as C long; normally either int64 or int32)

这就是为什么你会看到溢出。在构造数组时,您必须指定其他类型,这样它就不会溢出。

关于python - 正数之和得出负数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43956551/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com