为什么我的代码在visual studio中返回-nan,而在Linux中却没有?

时间:2017-10-13 19:45:01

标签: c linux visual-studio-2017

My Gauss Elimination代码的结果在visual studio中是-nan,但在Linux中却没有。

Linux的结果非常糟糕,因为在函数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;
}

1 个答案:

答案 0 :(得分:0)

1。)OP使用错误的类型分配内存。这可能会导致内存不足和各种UB问题,并解释系统之间的差异,因为它们可能有不同的指针和float大小。

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

而是分配给引用变量的大小。更容易编码(和正确),审查和维护。

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。)一般问题解决技巧:

检查scanf("%f", &matrix[i][j]);的返回值。它是1?

启用所有警告。

特别是对于调试,使用"%e"而不是"%f"打印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;
          }
        }