2011-09-19 2 views
2

숙제를 위해해야하는 Java 프로그램이 있는데 여기에 사용해야하는 수식은 picture of formula입니다. 죄송합니다. 저는 영어 원어민이 아니며이 수식의 이름을 모르겠습니다.이 수학 컴퓨팅에 대한 더 나은 해결책이 있습니까? (Java)

/* Check: 
* if: j<=3: 
* 
* 1/1+sqrt2=0,414213562 
* 1/sqrt2+sqrt3=0,317837245 
* 1/sqrt3+sqrt4=0,267949192 
*  res= 0,9999999 =~1.0 
*/ 
double sum = 0; 
for (int j = 2; j <= 624; j++) 
{ 
    sum += 1/((Math.sqrt(j) + Math.sqrt(j + 1))); 
} 
double res = 0; 
res = (double)1/(1 + Math.sqrt(2)) + sum; 

System.out.println("Result is: " + res); 

내가 j=3j=2위한 프로그램을 확인했습니다, 그리고 그것은 (약 1.0) 올바른 결과를 주었다

이 나는이 솔루션을 작성했습니다. 그래서 나는 그것이 잘 작동하고 있다고 생각합니다. 내가 j<=624까지 시도했습니다 때, 나의 결과는 다음과 같습니다 24.000000000000014

1. 어떻게 결과가 내 프로그램에서 24.0하지 24.000000000014 될 것입니다 만들 수 있습니까?

2.이 수학 공식을위한 더 나은 솔루션/소스 코드가 있습니까? 이 공식의 이름은 영어로 무엇입니까?

+2

+1 숙제로 기재하려면 +1하십시오.하지만 나중에 숙제 태그를 사용하십시오. – Rob

+0

@blaces : 링크에서 보안 오류가 나타납니다 : "서버의 인증서가 호스트 이름과 일치하지 않습니다." 컴퓨터 관리자가이 문제를 해결해야합니다. – rossum

답변

6

부동 소수점 계산의 세계에 오신 것을 환영합니다. 더 적은 수의 용어를 사용하거나 더 빠르게 수렴하는 방식으로 대수학을 사용하여 수식을 다시 작성할 수 없다면, 운이 좋지 않을 것입니다. 예를 통해 알 수 있듯이 부동 소수점 계산이 정확하지 않고 오류가 누적됩니다.

(이 경우 특정 힌트 : 검색어가 형태 X의 아르 K = 1/(SQRT (K) + SQRT (K + 1)) SQRT에서 분자와 분모를 승산 시도 (K + 1.) - sqrt (k))

+3

이해합니다. 그리고 분자와 분모를 곱 해줘서 고마워요. – blaces

0

첫 번째 질문 : double의 가장 가까운 정수를 반환하는 Math.round (double) 함수를 사용하십시오.

Math.floor (double)를 사용하여 보다 작은 가장 가까운 정수를 얻거나 double보다 큰 가장 가까운 정수를 반환하는 math.ceil (double)을 사용할 수도 있습니다.

+0

요점은 정수를 반환하지 않는 것이고, 요점은 예상 한 것과 가능한 한 가깝게 결과를 반환하는 것입니다. 624 대신 시리즈를 623으로 실행하면 정수 결과를 얻지 못합니다. –

+0

나는 이해한다 ... – Sonkey

0

Java 계산의 경우 BigDecimal을 사용해야합니다.

+1

-1 : BigDecimal에는 내장 sqrt() 연산이 없다. 얼마나 많은 소수점 자리를 사용해야하는지 어떻게 알 수 있습니까? –

+0

이 게시물을 참조하십시오 srt에 BigDecimal : http : //stackoverflow.com/questions/1384919/are-there-library-for-square-root-over-bigdecimal; 모든 경우에 루프에 double을 사용하여 추가해도 정확한 손실이 발생할 수 있습니다. BigDecimals의 경우에는 해당하지 않습니다 – rmk

+0

응답 메모에 동의하지 않아야합니다. BigDecimal가 문자 그대로 무한대의 정밀도를 처리 할 수없는 한, 당신은 틀립니다. 그렇다면 sqrt (2)를 BigDecimal로 인쇄하고 컴퓨터로 인쇄하는 데 걸린 시간을 알려주십시오. :피. –

관련 문제