Возможная потеря точности с Грам-Шмидтом

У меня есть код, который использует Грам-Шмидт внутри цикла. Я хочу максимально уменьшить количество вызовов этого алгоритма, но дело в том, что, несмотря на получение одного и того же результата до и после вызова, когда я печатаю результаты некоторых операций с использованием этих значений, они различаются. Например, в приведенном ниже коде результат 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,
Возможно ли, что у меня какая-то потеря точности или почему это происходит?

Спасибо

3

Решение

Там нет потери точности. У вас просто есть ошибка в вашем коде:

        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;
4

Другие решения


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector