2013-09-26 124 views
0

我对我的程序中看似无限的输入循环有个疑问。我确定它是在while循环中发生的,并且想知道是因为我的数学还是我的编码。尽管循环对我来说仍然是新的,所以任何帮助或解释都会很好!这个程序是一个程序的开始,它使用牛顿的方法找到z的第p个根,残差和循环之间的改进。另外,我想知道for循环对我的目的是否会更好。这是迄今为止:While函数中的输入循环

#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; 
} 
+2

由于浮点数的工作原理,'x'永远等于'0'的可能性很小。您可能需要将其与epsilon值进行比较,例如。 fabs(x) syam

回答

2

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

1

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

实施例:

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

这清楚的是,可变i表示迭代,因为它是在每个迭代结束时以及所述一个递增被测试为继续条件的一个。

相反,您的循环使用x来测试延续,而n则增加。对于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循环更清晰。