Matlab матричное умножение и транспонирование точности
Следующий скрипт должен распечатать матрицу 7x7 "все единицы", потому что уравнение выполнено.
A = rand(5,7);
B = rand(5,7);
C = (A' * B)';
D = B' * A;
C == D
Вместо такого ответа:
ans =
1 1 1 1 0 1 1
1 1 1 1 0 1 0
1 1 1 1 1 1 1
1 1 1 1 0 0 0
1 0 1 1 1 1 1
0 0 1 1 1 1 1
0 1 1 0 1 1 1
Я думаю, что это проблема точности с плавающей точкой, потому что с format long
цифры различаются в C и D.
- Что я делаю не так?
- Где это идет не так?
- Как я могу избежать этого?
1 ответ
Вы не делаете ничего плохого - компьютер имеет конечную точность, и ваши вычисления показывают это - точно так же, как 1e6 + 0.1 - 1e6
(попробуйте это в Matlab). Один из способов избежать этого - использовать некоторую библиотеку для произвольной точности - но это не "решит" ее, просто подтолкнет проблему к все меньшим и меньшим числам.
Смотрите эти ссылки для получения дополнительной информации:
http://floating-point-gui.de/errors/comparison/
http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html
Кстати, format long
не имеет ничего общего с фактической точностью, он просто устанавливает форматирование чисел для отображения.