2014-09-22 2 views
4

인터넷을 통해이 주제를 철저히 조사했으며 스레드가 죽었거나 제 책에 설명 된 것과 다른 방법을 사용합니다. 예 : http://www.geeksforgeeks.org/square-root-of-a-perfect-square/. 내 알고리즘이 마지막 "추측"의 1 %에 도달 할 때까지 루프를 수행해야하기 때문에이 기능이 작동하지 않습니다.C++의 제곱근에 대한 바빌론 알고리즘의 무한 루프 얻기

다음은 본문의 질문입니다.

바빌론 알고리즘

다음과 같이 숫자 n의 제곱근이 계산 :
  1. 이 번호로 추측합니다 (당신은 N 초기 추측 등/2를 선택할 수 있습니다).
  2. 계산 R = N /이
  3. 세트 같다 = (추측 + R)/2
  4. 맞춰 필요한만큼 반복에 대해 2 단계로 되돌아갑니다. 2 단계와 3 단계가 반복 될수록 더 가까운 추측은 n의 제곱근이됩니다.

추측은, 이전의 추측의 1 % 이내이며 double로 응답을 출력 할 때까지 바빌로니아 알고리즘을 통해 N, 반복에 대한 정수를 입력하는 프로그램을 작성한다.

#include <iostream> 

using std::cout; 
using std::cin; 
using std::endl; 

int main() 
{ 
int n; 
double r, guess(4), lastGuess; 

cout << "Enter a number to find the square root of: "; 
cin >> n; 

do 
{ 

    r = n/guess; 
    lastGuess = guess; 
    guess = (guess + r)/2; 

// cout <<"Guess: " << guess << endl; 
// cout <<"Last Guess: " << lastGuess << endl; 

    cout << "Guess : " << guess << endl; 
    cout << "Last Guess 1% = " << lastGuess + (lastGuess * 0.01) << endl; 
    cout << "r = " << r << endl; 

} while(guess >= lastGuess * 0.01); 
cout << r; 

return 0; 
} 

이 프로그램은 연구에 대한 정답을 계산하지만, 루프보다 큰 1 % lastGuess에 추가되는 추측에도 불구하고 종료되지 않습니다

나는 다음과 같은 코드를 작성했습니다.

이 프로그램은 144를 n으로 입력 할 때 다음 출력을 생성합니다.

.... 
r = 12 
Guess : 12 
Last Guess 1% = 12.12 
r = 12 
Guess : 12 
Last Guess 1% = 12.12 
r = 12 
Guess : 12 
Last Guess 1% = 12.12 
r = 12 
Guess : 12 
Last Guess 1% = 12.12 
.... 

루트 (r)가 정확합니다 (12). 추측은 lastGuess (12 < 12.12)보다 작으며 조건에 false를 반환해야합니까? 루프가 끝나지 않는 이유는 무엇입니까?

답변

4

1 %를 추가하려면 0.01이 아닌 1.01을 곱해야합니다.

그런데 이것은 추측이 1 % 이상 증가하는 동안 반복됩니다. 그 반대의 경우도 1 % 이상 줄어들 수 있습니다. 근사는 어느 방향에서든 그 해답에 접근 할 수 있습니다. (그것은 왼쪽에서 오른쪽에서 긍정적 인 뿌리와 음의 뿌리에 접근하게됩니다.)

+0

오른쪽! 이 말이 맞습니다. 내 원래 표현식은 lastGuess + (lastGuess * 0.01)입니다.나는 내가 기억할 수없는 이유로 그것을 꺼냈다. 지금은 의미가 있습니다. 그것은 (lastGuess * 1.01)과 같은 것이어야합니다. 또한 n이 4보다 작 으면 지금 무슨 뜻인지 알 수 있습니다. 감사합니다. –

+0

"반대쪽도 허용해야합니다. 1 % 이상 축소되었을 수 있습니다."다행히도 반복 횟수는 너무 높거나 너무 낮습니다. –

+0

@DavidEisenstat 뉴턴의 방법이 번갈아 나타날 수 있습니다. 바빌론 방법은 오른쪽에서 수렴하는 경향이 있습니다. –

3

당신이

lastGuess + (lastGuess * 0.01) 

를 사용하지만 루프 조건을 확인하는 동안

lastGuess*0.01 
를 사용하여 lastGuess를 인쇄하는 동안

루프 상태에서 lastGuess 값을 인쇄하는 데 사용하는 것과 동일한 방정식을 사용하십시오.