EDIT: удалена ссылка на Pastebin, так как в ней была идентифицирующая информация. @Jester решил проблему.
Я пишу программу в MIPS Assembly, чтобы найти обратную матрицу 3x3. Однако только первые два элемента полученной обратной матрицы содержат правильные значения, а остальные как-то не так.
Я использую симулятор MARS, хотя пробовал несколько онлайн. Все они дали мне одинаковый (неправильный) результат. Поэтому я считаю, что проблема заключается в моем коде, но он выглядит логически правильным.
Вот «проблемные области». $ s0 хранит исходную матрицу, $ f0 хранит определитель, $ s1 должен хранить обратную матрицу. И $ s0, и $ s1 были распределены с использованием системных вызовов. Остальной код, доступный здесь (pastebin): (УДАЛЕНО)
#A(3,1)->(1,3)
lwc1 $f1, 4($s0)
lwc1 $f2, 20($s0)
mul.s $f1, $f1, $f2
lwc1 $f2, 8($s0)
lwc1 $f3, 16($s0)
mul.s $f2, $f2, $f3
sub.s $f1, $f1, $f2 #(1,3)
div.s $f1, $f1, $f0 #Divide by determinant
swc1 $f1, 8($s1) #Store (1,3)
#...Up until:
#A(3,3)->(3,3)
lwc1 $f1, 0($s0)
lwc1 $f2, 16($s0)
mul.s $f1, $f1, $f2
lwc1 $f2, 4($s0)
lwc1 $f3, 12($s0)
mul.s $f2, $f2, $f3
sub.s $f1, $f1, $f2 #(3,3)
div.s $f1, $f1, $f0 #Divide by determinant
swc1 $f1, 32($s1) #Store (3,3)
Например, для матрицы:
3.0 6.0 2.0
4.0 7.0 2.0
5.0 6.0 3.0
Ожидаемое обратное значение:
-1.28571 0.857143 0.285714
0.285714 0.142857 -0.285714
1.57143 -1.71429 0.428571
Однако мой код дает следующий результат:
-1.2857143 0.85714287 -1.4693878
0.4985423 -1.1432736 -0.26239064
-0.14894302 -0.9172964 -1.4693878