【问题标题】:Input Loop in While functionWhile 函数中的输入循环
【发布时间】:2013-09-26 00:05:07
【问题描述】:

我有一个关于我的程序中看似无限的输入循环的快速问题。我确定它发生在 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;
}

【问题讨论】:

  • 由于浮点数的工作原理,x 永远等于 0 的可能性很小。您可能希望将其与 epsilon 值进行比较,例如。 fabs(x) &lt; some_epsilon_you_chose.

标签: c++ while-loop infinite-loop


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    对于您的无限循环问题,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 循环更清晰。

    【讨论】:

      猜你喜欢
      • 2018-03-23
      • 1970-01-01
      • 2016-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-03
      • 2021-01-14
      • 1970-01-01
      相关资源
      最近更新 更多