почему я получаю отрицательное значение при расчете матрицы со всем положительным числом в степени 1024? - PullRequest
2 голосов
/ 13 октября 2019

Я вычисляю очень простые 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 Ответ

1 голос
/ 13 октября 2019

Вы правы, что на самом деле ценности положительные. Однако Numpy здесь использует 32-разрядное целочисленное представление этих чисел (на 64-разрядных компьютерах, вероятно, используется 64-разрядное число).

Таким образом, это означает, что массив может содержать только числа между -2 31 и 2 31 -1 в качестве значений. Если вы выполняете вычисления с большими числами, то обычно происходит циклический переход, выполняется арифметика, а последние 32-разрядные числа будут интерпретироваться как 32-разрядное число со знаком.

Мы можем использоватьнапример, 128-битное число с плавающей запятой, чтобы получить аппроксимацию значений:

>>> A = np.array([[3,2],[1,4]]<b>, dtype=np.float128</b>)
>>> 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]]<b>, dtype=np.float64</b>)
>>> np.linalg.matrix_power(A, 1024)
array([[<b>inf</b>, inf],
       [inf, inf]])
...