我正在计算一个非常简单的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]])
我的期望值都是正数,但是为什么它返回负值?
您是正确的,实际上这些值是正的。但是,此处的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]])