我正在计算一个非常简单的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]])
我期望所有正数的值,但是为什么它返回负值?
答案 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]])