我有一个关于程序中看似无限的输入循环的快速问题。我确定它发生在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;
}
答案 0 :(得分:2)
通常,使用浮点运算测试相等性是一个坏主意。我不知道你的数学和/或编码是否正常,但我猜机会x
永远不会完全等于零。考虑将其更改为while (fabs(x) < 1e-10)
。
答案 1 :(得分: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循环更清晰。