2017-10-13 6 views
-1

My Gauss Eliminationコードの結果は、Visual Studioでは-nanですが、Linuxでは表示されません。なぜ私のコードは、Linuxではなく、Visual Studioで返されますか?

func Gauss_Eliで変数がどれくらい増えたのか、funcが動作しているブロックで変数kを増やすと、結果はひどいです...セグメントエラーは発生しません。

私のコードで何が問題になっていますか?

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; 
} 
+0

あなたはゼロどこかで除算を持っている場合、正確な減算を確認してください。あなたが持っているすべての部門をチェックしてください。 –

+0

'matrix [i] [i]'は '.../matrix [i] [i])で使用する前に0.0になりません。 – chux

+1

'matrix =(float **)malloc(sizeof(float)* n);'が間違っています。 'matrix = malloc(sizeof * matrix * n);'を使い、間違ったサイズを使うことのエラーを避けてください。 – chux

答えて

0

1.)OPは間違ったタイプのメモリを割り当てます。これは、不十分なメモリとあらゆる種類のUBの問題につながり、異なるポインタとfloatサイズを持つ可能性のあるシステムの違いを説明します。

float ** matrix;      
//         v--- wrong type  
// matrix = (float**)malloc(sizeof(float) * n); 

代わりに、参照される変数のサイズに割り当てます。簡単にコーディングして(そして適切に)、レビューし、維持します。 scanf("%f", &matrix[i][j]);

チェック戻り値:

matrix = malloc(sizeof *matrix * n); 
if (matrix == NULL) Handle_Error(); 

2)コードは0.0

 //for (int k = 0; k < n + 1; k++) { 
     // float e; 
     // e = matrix[i][k] * (matrix[j][i]/matrix[i][i]); 
     // matrix[j][k] -= e; 
     //} 
     if (matrix[i][i] == 0.0) Handle_Error(); 
     float m = matrix[j][i]/matrix[i][i]; 
     for (int k = 0; k < n + 1; k++) { 
      matrix[j][k] -= matrix[i][k]*m; 
     } 

3)一般的な問題解決のヒントによる除算を探す必要があります。それは1ですか?

すべての警告を有効にします。

特に、デバッグの場合は"%f"ではなく"%e"を使用してFPを印刷します。

4)数値解析のヒント:i==j

 if (i == j) { 
      for (int k = 0; k < n + 1; k++) { 
      matrix[j][k] = 0.0; 
      } 
     else { 
      if (matrix[i][i] == 0.0) Handle_Divide_by_0(); 
      float m = matrix[j][i]/matrix[i][i]; 
      for (int k = 0; k < n + 1; k++) { 
      matrix[j][k] -= matrix[i][k]*m; 
      } 
     } 
関連する問題