Здравствуйте! Написал программу, приводящую матрицу к диагональной элементарными преобразованиями. На некоторых матрицах она работает корректно, а на других -- нет. Например, если ввести такую:
Код:
30 20 15 12
20 15 12 15
15 12 15 20
12 15 20 30
программа выдаёт следующее:
Код:
30.000000 0.000000 0.000000 0.000000
0.000000 0.000000 0.000000 0.000000
0.000000 0.000000 -38280596832649256.000000 0.000000
0.000000 0.000000 0.000000 -10.349020
Что интересно, определитель она считает верно, хотя видно в данном случае, что на диагонали есть нуль (а детерминант равен 2639). Помогите, пожалуйста, найти ошибку.
Код:
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
void det(double **m, int *k, int n, double *D);
void det(double **m, int *k, int n, double *D)
{
int i, j, p, u, s;
double x, y;
(*D)=1;
for(j=0; j<n; j++)
{
for(i=0; i<n; i++)
{
if((m[i][j]!=0)&&(j<=i))
{
for(p=0; p<n; p++)
{
if(p!=i)
{
y=m[p][j]/m[i][j];
for(u=0; u<n; u++)
{
m[p][u]-=y*m[i][u];
}
}
}
for(s=0; s<n; s++)
{
if(j!=i)
{
x=m[j][s];
m[j][s]=m[i][s];
m[i][s]=x;
(*D)=(*D)*(-1);
}
}
}
}
}