인터넷을 통해이 주제를 철저히 조사했으며 스레드가 죽었거나 제 책에 설명 된 것과 다른 방법을 사용합니다. 예 : http://www.geeksforgeeks.org/square-root-of-a-perfect-square/. 내 알고리즘이 마지막 "추측"의 1 %에 도달 할 때까지 루프를 수행해야하기 때문에이 기능이 작동하지 않습니다.C++의 제곱근에 대한 바빌론 알고리즘의 무한 루프 얻기
다음은 본문의 질문입니다.
바빌론 알고리즘
다음과 같이 숫자 n의 제곱근이 계산 :
- 이 번호로 추측합니다 (당신은 N 초기 추측 등/2를 선택할 수 있습니다).
- 계산 R = N /이
- 세트 같다 = (추측 + R)/2
- 맞춰 필요한만큼 반복에 대해 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를 반환해야합니까? 루프가 끝나지 않는 이유는 무엇입니까?
오른쪽! 이 말이 맞습니다. 내 원래 표현식은 lastGuess + (lastGuess * 0.01)입니다.나는 내가 기억할 수없는 이유로 그것을 꺼냈다. 지금은 의미가 있습니다. 그것은 (lastGuess * 1.01)과 같은 것이어야합니다. 또한 n이 4보다 작 으면 지금 무슨 뜻인지 알 수 있습니다. 감사합니다. –
"반대쪽도 허용해야합니다. 1 % 이상 축소되었을 수 있습니다."다행히도 반복 횟수는 너무 높거나 너무 낮습니다. –
@DavidEisenstat 뉴턴의 방법이 번갈아 나타날 수 있습니다. 바빌론 방법은 오른쪽에서 수렴하는 경향이 있습니다. –