繁体   English   中英

While函数中的输入循环

[英]Input Loop in While function

我对我的程序中看似无限的输入循环有一个快速的问题。 我确定它是在while循环中发生的,并且想知道这是因为我的数学还是我的编码。 虽然循环对我来说仍然是新的,所以任何帮助或解释都将很不错! 该程序是使用牛顿方法查找z的p根,残差以及循环之间的改进的程序的开始。 另外,我想知道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;
}

通常,用浮点算术测试相等性是一个坏主意。 我不知道您的数学和/或编码是否还可以,但是我想x的机会永远不会完全等于零。 考虑将其更改为while (fabs(x) < 1e-10)

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

例:

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

在这里很明显,变量i代表迭代,因为它是在每次迭代结束时递增的变量,也是要作为连续条件进行测试的变量。

相反,当n增加时,循环使用x来测试连续性。 对于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循环更加清晰。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM