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 не имеет ничего общего с фактической точностью, он просто устанавливает форматирование чисел для отображения.

Другие вопросы по тегам