Почему возникает ошибка nan(ind)?

Пытаюсь привести матрицу к треугольному виду. На входе

4
10 23 17 44 25
15 35 26 69 40
25 57 42 108 65
30 69 51 133 95

// на входе принимается размер матрицы

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;

int main() {

    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);
    int n;
    cin >> n;
    int m = n + 1;// размер матррицы вместе с векторм b [n][m]
    double a[4][5];
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++)
            cin >> a[i][j];
    }


    ////проверяем, что первый элемент первого столбца не равен 0
    for (int i = 0; i < n-1; i++) {
        for (int i = 0; i < n - 1; i++) {
            if (a[i][0] == 0) {
                for (int y = 0; y < m; y++) {
                    int z = a[i][y];
                    a[i][y] = a[i + 1][y];
                    a[i + 1][y] = z;
                }
            }
        }
    }

    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++)
            cout << a[i][j] << " ";
        cout << endl;
    }//вывели матрицу

    //cout << endl;
//приводим к треугольному виду
    for (int i = 0; i < n - 1; i++) {
        {
            if (a[i][i] != 0) {
                
                 for (int k = i; k < n - 1; k++) {
                
                    float s = a[k + 1][i] / a[k][i];
                
                    for (int x = i; x < m; x++) {
                        float c = a[k][x] * (-1) * s;
                        a[k + 1][x] = a[k + 1][x] + c;
                    }
                 }
                
            }
        }
    }


 

    cout << endl;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++)
            cout << a[i][j] << " ";
        cout << endl;
    }//вывели матрицу

}

Ответы (1 шт):

Автор решения: Harry

Потому что вы делите на 0.

Запишите

assert(a[k][i] != 0);

перед

float s = a[k + 1][i] / a[k][i];

и убедитесь в этом сами...

Что и неудивительно - ведь матрица

10 23 17  44
15 35 26  69
25 57 42 108
30 69 51 133

вырожденная, ее определитель равен 0...

P.S. Что-то странный у вас вложенный цикл

for (int i = 0; i < n-1; i++) {
    for (int i = 0; i < n - 1; i++) {

нет? i во вложенном цикле скрывает i из внешнего, да и дальнейшее вызывает сомнения... int z = a[i][y]; тоже как-то не комильфо :) - зачем double до int обрезать?
Но главное - какой смысл в проверках до преобразований? Ведь именно в их процессе очередной опорный элемент может стать нулевым! Возьмите простую матрицу, типа

1  1
1  1

и вручную убедитесь, что первая ваша проверка работает, но уже после первой итерации преобразований вы получите нулевую вторую строку - и никаких проверок такой неприятности у вас уже нет.

→ Ссылка