2013-09-26 6 views
0

내 프로그램에서 겉으로보기에는 무한한 입력 루프에 대한 빠른 질문이있었습니다. while 회 돌이에서 일어난다는 것이 확실합니다. 내 수학 또는 코딩 때문인지 궁금해합니다. while 루프는 여전히 나에게 새로운 것이므로 어떤 도움이나 설명도 좋을 것입니다. 이 프로그램은 Newton의 방법을 사용하여 z의 p 번째 루트, 잔차 및 루프 간의 개선을 찾는 프로그램의 시작입니다. 또한 for 루프가 제 목적에 더 잘 될지 궁금합니다. 여기까지입니다 :While 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'과 같은 가능성은 거의 없습니다. 대신 엡실론 값과 비교해보십시오. 'fabs (x) syam

답변

2

일반적으로 부동 소수점 산술과 같은지 테스트하는 것은 좋지 않습니다. 귀하의 수학 및/또는 귀하의 코딩이 괜찮은지 모르겠지만, 기회가 x과 정확히 일치하지 않을 것이라고 생각합니다. while (fabs(x) < 1e-10)과 같은 것으로 변경하십시오.

1

Nickie는 무한 루프 문제가 무엇인지에 대한 좋은 대답을 가지고 있습니다. 난 그냥 명확한 반복 변수가 없기 때문에 while 루프를 사용하는 것이이 컨텍스트에서 유용하다는 것을 추가하고 싶다.

예 : 여기

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

연속 조건으로 시험되는 각 반복의 끝뿐만 아니라 하나 증가되고 하나이기 때문에 가변 i 반복 처리를 나타내는 것이 분명 .

이와 대조적으로 루프는 을 사용하여 연속을 테스트하고 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 루프가 명확하다고 생각합니다.