Очевидной причиной является недостаточная точность вычислений с плавающей точкой, в этих циклах ошибки округления накапливаются немного по разному.
Стандартным советом должен бы стать совет увеличить точность промежуточных переменных, но форматов точнее double вроде бы в стандартных библиотеках нет (и уж тем более они не будут ускоряться векторизацией). А с подключением библиотек работы с числами произольной точности резко упадёт скорость вычислений. Можно подключить и просто перепроверить какой именно результат точнее, но это будет адекватно лишь для конкретных матриц, при любом изменении матриц погрешность может и измениться. Я бы верил первому циклу, т.к. он может (хотя и не обязательно) в промежуточных вычислениях использовать более точный формат чисел. Ещё можно переписать весь вычислительный цикл в командах x87 (сопроцессор с плавающей точкой), у него внутренее представление чисел заметно точнее double, для матриц вменяемых размеров должно хватить.
Ещё, раньше я бы посоветовал провести два (три) раза вычисления с округлением в разные стороны и получить минимум и максимум (и вероятное значение если три раза) для каждой переменной на выходе, но как это сейчас реализовать и пользуется ли вообще кто-то этим методом я не в курсе.
Самым правильным методом для работы с любыми матрицами будет ознакомиться с стандартными методами повышения точности решения СЛАУ и их и использовать (кажется там применяются хитрые перестановки элементов матриц в зависимости от конкретных значений чтобы получить как можно меньшую погрешность каждой операции, например сумму произведений вычислять от меньших чисел к большим). Скорее всего это опять заметно замедлит вычисления.
Ну или осуществлять выборочную проверку точности вычислений для каждого "прогона" программы с разными исходными данными в матрицах использованием медленной библиотеки работы с числами произвольной точности. Выборочную чтобы не замедлять
все вычисления и в то же время получить примерную оценку погрешности результата.
Или взять в руку карандаш и руками выписать погрешности каждой операции в программе (по ассемблерному листингу!) и потом долго сворачивать их к одному конечному результату.
Величина получится огромной, но зато точной.
В общем проще всего оценить реальную погрешность вычислений и смириться с ней. Если никто не предложит более практичного способа.
PS. А, да, проверить расчёт с произвольной точностью можно в
Математике (или других системах алгебры), там кажется можно указывать любую точность чисел с плавающей точкой. Будет медленно, зато сильно точнее.