0

我有一个关于我的程序中看似无限的输入循环的快速问题。我确定它发生在 while 循环中,我想知道这是因为我的数学还是我的编码。虽然循环对我来说仍然是新的,所以任何帮助或解释都会很好!这个程序是一个程序的开始,它使用牛顿法找到 z 的 pth 根、残差和循环之间的改进。另外,我想知道 for 循环是否更适合我的目的。到目前为止:

#include <iostream>
#include <cmath>

using namespace std;

double Newton(double z, int p, double &x, double &n);

int main(){
    double z, x, n, residual, bai, bri;
    int p;
    x = 1;
    n = 1;
    cin >> z >> p;
    double roots = Newton(z, p, x, n);
    cout.precision (5);
    cout << "Input: z = " << z << ", p = " << p << endl << "Root = " << x << endl;
}

double Newton(double z, int p, double &x, double &n){
    x = (x - ((pow (x, p) - z)/(p * (pow (x, (p - 1))))));
    while (x != 0){
            x = (x - ((pow (x, p) - z)/(p * (pow (x, (p - 1))))));
            n++;
    }
    return x;
}
4

2 回答 2

2

一般来说,用浮点算术测试相等性是一个坏主意。我不知道你的数学和/或编码是否正常,但我猜机会x永远不会完全等于零。考虑将其更改为类似while (fabs(x) < 1e-10).

于 2013-09-26T00:10:36.173 回答
1

对于你的无限循环问题,Nickie 有一个很好的答案。我只是想补充一点,在这种情况下您可以使用 while 循环,因为您没有明确的迭代变量。

例子:

for (int i=0; i < 10; ++i) {
    cout << i << endl;
}

很明显,变量i代表了迭代,因为它是在每次迭代结束时递增的变量,也是作为延续条件测试的变量。

相反,您的循环用于x测试是否继续,而它n是递增的。对于 for 循环,这不是一个明确的案例。在您的情况下,for 循环如下所示:

double Newton(double z, int p, double &x, double &n) {
    for (x = (x - ((pow (x, p) - z)/(p * (pow (x, (p - 1)))))); x != 0; n++) {
        x = (x - ((pow (x, p) - z)/(p * (pow (x, (p - 1))))));
    }
    return x;
}

这也不可怕,但我认为 while 循环更清晰。

于 2013-09-26T00:27:29.077 回答