Gram-Schmidt可能会导致精度下降

时间:2014-08-16 09:57:11

标签: c++ precision floating-point-precision double-precision

我有一个在循环中使用Gram-Schmidt的代码。我希望尽可能减少对该算法的调用次数,但问题是尽管在调用之前和之后获得了相同的结果,但是当我使用这些值打印某些操作的结果时,它们是不同的。例如,在下面的代码中,abs(muGS[k][0]) - abs(before2)的结果应为0或非常接近0,因为此变量的打印值(在调用之前和之后)是相同的。但是,这不会发生什么。 muGS是一个双矩阵,其值通常介于0和1之间。

int k = 1;
double before2;

while(k < end) {

    before2 = muGS[k][0];

    gramSchmidt(b, muGS, cGS, k);

    //prints for debug
    if (abs(muGS[k][0]) - abs(before2) > 0.1) {

        if (abs(muGS[k][0]) - abs(before2) > 0.1)  {
            cout << "1 muGS[k] diff:" << abs(muGS[k][0]) - abs(before2) << endl;
            cout << "1 muGS[k] before:" << muGS[k][0] << endl;
            cout << "1 muGS[k] after:" << muGS[k][0] << endl;
            cout << "1 muGS[k] mult before:" << before2 * before2 << endl;
            cout << "1 muGS[k] mult after:" << muGS[k][0] * muGS[k][0] << endl;
            cout << "1 muGS[k] abs before:" << abs(before2) << endl;
            cout << "1 muGS[k] abs after:" << abs(muGS[k][0]) << endl;
        }
        getchar();
    }

    for (i = k-1; i >= 0; i--) {
        for (j = 0; j < i; j++) {
            muGS[k][j] -= round(muGS[k][i]) * muGS[i][j];
        }
    }

    //some other operations that don't change the value of muGS
    k++;
}

输出:

1 muGS[k] diff:0.157396
1 muGS[k] before:0.288172
1 muGS[k] after:0.288172
1 muGS[k] mult before:0.0171023
1 muGS[k] mult after:0.083043
1 muGS[k] abs before:0.130776
1 muGS[k] abs after:0.288172

另一件事是before2的绝对值与before2的值非常不同。 我是否有可能出现精确损失或者为什么会发生这种情况?

由于

1 个答案:

答案 0 :(得分:4)

没有精确损失。您的代码中只有一个错误:

        cout << "1 muGS[k] before:" << muGS[k][0] << endl;
        cout << "1 muGS[k] after:" << muGS[k][0] << endl;

您可以为之前和之后打印相同的值。 但应该坚持:

        cout << "1 muGS[k] before:" << before2 << endl;
        cout << "1 muGS[k] after:" << muGS[k][0] << endl;