Les résultats de mon code Gauss Elimination sont -nan dans Visual Studio, mais pas sous Linux.Pourquoi mon code renvoie -nan dans Visual Studio, mais pas sous Linux?
Et les résultats de Linux sont affreux car à la fonction Gauss_Eli combien j'augmente la variable k
à pour les blocs que la fonction fonctionne ... ne se produit pas d'erreur de segment.
Quel est le problème avec mon code?
float ** Gauss_Eli(float ** matrix, int n) {
// -----------------------------------------------------
// | |
// | Eliminate elements except (i, i) element |
// | |
// -----------------------------------------------------
// Eliminate elements at lower triangle part
for (int i = 0; i < n; i++) {
for (int j = i + 1; j < n; j++) {
for (int k = 0; k < n + 1; k++) {
float e;
e = matrix[i][k] * (matrix[j][i]/matrix[i][i]);
matrix[j][k] -= e;
}
}
}
// Eliminate elements at upper triangle part
for (int i = n - 1; i >= 0; i--) {
for (int j = i - 1; j >= 0; j--) {
for (int k = 0; k < n + 1; k++) {
float e;
e = matrix[i][k] * (matrix[j][i]/matrix[i][i]);
matrix[j][k] -= e;
}
}
}
// Make 1 elements i, i
for (int i = 0; i < n; i++)
for (int j = 0; j < n + 1; j++) matrix[i][j] /= matrix[i][i];
return matrix;
}
int main() {
float ** matrix;
int n;
printf("Matrix Size : ");
scanf("%d", &n);
// Malloc variable matrix for Matrix
matrix = (float**)malloc(sizeof(float) * n);
for (int i = 0; i < n; i++) matrix[i] = (float*)malloc(sizeof(float) * (n + 1));
printf("Input elements : \n");
for (int i = 0; i < n; i++)
for (int j = 0; j < n + 1; j++) scanf("%f", &matrix[i][j]);
matrix = Gauss_Eli(matrix, n);
printf("Output result : \n");
//Print matrix after elimination
for (int i = 0; i < n; i++) {
for (int j = 0; j < n + 1; j++) printf("%.6f ", matrix[i][j]);
printf("\n");
}
return 0;
}
Vous avez une division par zéro quelque part. Vérifiez toutes les divisions que vous avez. –
Bien sûr 'matrix [i] [i]' n'est jamais 0.0 avant utilisation dans '.../matrix [i] [i]);'? – chux
'matrice = (float **) malloc (sizeof (float) * n);' est faux. Utilisez 'matrix = malloc (sizeof * matrix * n);' et évitez l'erreur d'utiliser la mauvaise taille. – chux