gpt4 book ai didi

c++ - Gram-Schmidt 可能导致精度损失

转载 作者:太空狗 更新时间:2023-10-29 20:59:09 25 4
gpt4 key购买 nike

我有一个在循环中使用 Gram-Schmidt 的代码。我想尽可能地减少对该算法的调用次数,但问题是,尽管在调用前后得到相同的结果,但当我使用这些值打印某些操作的结果时,它们是不同的。例如,在下面的代码中,abs(muGS[k][0]) - abs(before2) 的结果应该是 0 或非常接近 0,因为这个变量的打印值(之前和通话后)是一样的。然而,事实并非如此。 muGS 是一个 double 矩阵,其值通常在 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 的值非常不同。是否有可能我的精度有所下降,或者为什么会发生这种情况?

谢谢

最佳答案

没有精度损失。你只是在你的代码中有一个错误:

        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;

关于c++ - Gram-Schmidt 可能导致精度损失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25339015/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com