为什么在计算所有正数均为1024的幂的矩阵时会得到负值?

时间:2019-10-13 18:30:39

标签: numpy matrix matrix-multiplication

我正在计算一个非常简单的2 * 2矩阵A =([[3,2],[1,4]])的幂为1024。我使用的是numpy函数np.linalg.matrix_power(A, 1024)。如您所见,此矩阵中没有负数,但是Python返回的是负数。

我在不同的计算机上尝试过,但是它仍然返回负值。

import numpy as np
A = np.array([[3,2],[1,4]])
A_1024 = np.linalg.matrix_power(A, 1024)

结果是

array([[-1201800533,  1891366230],
       [-1201800533,  1891366230]])

我期望所有正数的值,但是为什么它返回负值?

1 个答案:

答案 0 :(得分:1)

您是正确的,实际上这些值是正的。但是,Numpy在这里使用这些数字的32位整数表示形式(在64位计算机上,可能使用的是64位数字)。

因此,这意味着数组只能包含介于 -2 31 2 31 -1 之间的数字作为价值。如果您使用较大的数字进行计算,通常会发生环绕,执行算术运算,最后32位数字将重新解释为带符号的32位数字。

我们可以使用例如128位浮点数来获得近似值:

>>> A = np.array([[3,2],[1,4]], dtype=np.float128)
>>> np.linalg.matrix_power(A, 1024)
array([[1.85422822e+715, 3.70845643e+715],
       [1.85422822e+715, 3.70845643e+715]], dtype=float128)

在这里我们看到的数字约为1.854×10 715 和3.708×10 715 ,它们是巨大的数字。一个32位数字最多只能表示2'147'483'647的值,因此远远低于实际值。

对于64位浮点数,它甚至不再可以表示,因此使用了无穷大:

>>> A = np.array([[3,2],[1,4]], dtype=np.float64)
>>> np.linalg.matrix_power(A, 1024)
array([[inf, inf],
       [inf, inf]])