Почему numpy неверно считает определитель матрицы

import numpy as np


A = np.array([[1, 1, 2, -1],
              [2, -1, 0, -5],
              [-1, -1, 0, -2],
              [6, 3, 4, -3]])

print(np.linalg.det(A))

Считаю таким образом. Определитель должен быть равен нулю, я проверял на бумажке и в онлайн калькуляторах. Но этот код дает такой ответ 5.329070518200744e-15. Что я делаю не так? Может где-то невнимателен был, а если нет, то каким образом лучше вычислять?


Ответы (1 шт):

Автор решения: CrazyElf

Полагаю, что это может зависеть разве что от версий Python и особенно Numpy. В Google Colaboratory выходит ровно 0.0, даже если печатать 64 знака после запятой. Я пробовал ставить разный тип данных (по умолчанию в этой матрице получается numpy.int64), например numpy.int16 или numpy.float32 - без разницы, всё-равно выходит 0.0. А вот numpy.float16 выставить нельзя, на него linalg ругается, что с ним не работает. Но проверьте ради интереса, какой у вас тип данных получается в матрице:

print(type(A[0,0]))

В Google Colaboratory такие версии стоят:

Python 3.6.9
Numpy 1.18.5

Код, которым я всё проверял:

import numpy as np

A = np.array([[1, 1, 2, -1],
              [2, -1, 0, -5],
              [-1, -1, 0, -2],
              [6, 3, 4, -3]] #, dtype=np.float32)
            )

print(np.__version__)
print(type(A[0,0]))  
print(np.linalg.det(A))
print(f"{np.linalg.det(A):.64f}")

Результат:

1.18.5
<class 'numpy.int64'>
0.0
0.0000000000000000000000000000000000000000000000000000000000000000
→ Ссылка