Код
void GaussSolve(double * A, double * Y, int num){
//zeroeing left lower part of A[]
for (int k = 0; k < num - 1; k++){ //diagonal
for (int j = k + 1; j < num; j++){ //vertical
double m = A[k + j * num] / A[k + k * num];
for (int i = k+1; i < num; i++) A[i + j * num] -= A[i + k * num] * m; //horizontal
Y[j] -= Y[k] * m;
}
}
//zeroeing right upper part of A[], Y only.
for (int k = num - 1; k > 0; k--)
for (int j = k - 1; j >= 0; j--)
Y[j] -= Y[k] * A[k + j * num] / A[k + k * num];
//return answer in Y
for (int i = 0; i < num; i++) Y[i] /= A[i + i * num];
}
обычный Гаусс на этих данных даёт ошибку 10^-12.
для прямоугольной матрицы при нахождении (A* A)^-1 A* поди не сильно больше наберётся.