2014-11-20 5 views
-2

저는 고등 학교의 초급 Java 과정에만 있기 때문에 Java를 배우고 있습니다. 여기에 내가 뉴튼 - 랩슨 방법을 사용하여 10.6의 큐브 루트의 근사치를 얻기 위해 노력하고있어Java 프로그램이 끝나지 않습니다

public static void CubeRoot(double number, double guess) 
{ 
    double r = number; 
    double a = guess; 
    double b = 0; 
    double goal = Math.pow(number,.333333333333); 
    while (Math.round(b * 10000)/10000 != Math.round(goal * 10000)/10000) 
    { 
     b = ((1/3)*((r/(a*a))+(2*a))); 
     b = a; 
    } 
    System.out.println(b); 
} 

내 프로그램입니다. 문제는 프로그램이 실행되지만 아무것도 인쇄하지 않는다는 것입니다.

+1

루프 내부에 인쇄물을 추가하면 'b'에 무슨 일이 일어나는지 알 수 있습니다. 또한 귀하의 RHS는 상수이기 때문에 한 번 계산하여 재사용하는 것이 좋습니다. – John3136

+0

부동 소수점 숫자는 까다 롭습니다. 이와 같은 상황에서 엄격한 평등은 사용자가 확인해야하는 것이 아닙니다. 대신 근사값이 대상의 일부 범위 내에있을 때 루프를 종료해야합니다. – Pointy

+0

@Pointy 이런 뜻인가요? 반면 (! = B + 0.0001 목표 || B = 목표! - 0.0001) \t \t \t \t { \t B = ((1.0/3.0) * ((R/(A * A)) + (2 * 에이))); \t \t \t a = b; \t \t} – PirateDong

답변

7

하나의 값을 b에 할당하고이 값을 a으로 덮어 쓰면 계속 반복됩니다. 즉, 루프가 시작될 때마다 ba의 초기 값과 동일한 값을 갖게됩니다. 뉴튼 - 랩슨 알고리즘보고에서

, 나는 당신이 실제로 원하는 것은 생각이에 사용할 수 있도록, 당신은 단지 계산 b의 새로운 값과 동일 a을 설정합니다
b = ((1.0/3.0)*((r/(a*a))+(2*a))); 
a = b; 

다음 반복. 1/3 대신 1.0/3.0을 사용해야합니다. 정수 부분이 결과를 자르므로 1/30.33이 아니라 0과 같습니다. 휴식 상태는 루프가 영원히 b = ((1/3)*((r/(a*a))+(2*a))); b = a; 항상 a 이후 같은 대답으로 평가하기 때문에 결코 변경되지 않습니다 충족되지 않을 경우

+2

정수 나누기를 피하기 위해 (1/3)을 (1.0/3.0)으로 바꾸는 것도 좋습니다. –

+1

@JimLewis 좋은 전화입니다. 결정된. – resueman

0

당신은 두 번째 반복 한 후 이후 내부 루프를 해결해야합니다. 또한 위에서 설명한대로 b=a을 할당하면 첫 번째 계산이 취소됩니다. 그러나 어느 쪽이든, 내부 논리가 루프가 참으로 평가되는 것을 방해합니다.

관련 문제