2013-10-14 4 views
-3

저는 제곱근을 계산하기 위해 5 개의 다른 제곱근 알고리즘을 테스트하는 과학 경시 대회 프로젝트를 진행하고 있습니다. (내 질문에 here 참조).제곱근을 50 개로 계산하기

두 가지 옵션이 있습니다.

  • 각 프로그램을 설정된 시간 동안 실행하고 최종 결과가 2의 제곱근과 얼마나 가까운 지 비교하십시오.
  • 실행 각 프로그램은 두 가지의 제곱근은 오십 소수점에 대한 정확하고 System.nanoTime()

두 번째의 단점을 사용하여 촬영 시간을 비교할 때까지 확인하는 단순한 과정이 정확 여부이다 반복 할 때마다 소수점 50 자리에 시간이 걸리므로 결과가 정확하지 않습니다. 이 작업을 수행 할 다른 방법이 있으면 알려주십시오.

첫 번째 단점은 설정 한 시간 동안 프로그램을 실행하는 방법을 모르겠다는 것입니다.

어떤 조치를 취해야합니까?

+4

지금까지 노력 해보지 마십시오. 문제를 해결하기 위해 시도해보십시오. – Lion

+0

(Sideways thought) 루트를 한 번 계산 한 다음 해당 숫자를 1000 번 확인하십시오. 그 시간을 1,000으로 나누면 검사 비용이 얼마인지 알 수 있습니다. (about- ish. 캐싱 문제에주의하십시오. * 둘 중 하나의 실행을 서로 비교하고 싶지는 않습니다.) – usr2564301

답변

0

설정된 시간 동안 프로그램을 실행하는 방법을 모르겠습니다.

하나의 옵션은 스레드에서 x 시간 실행해야하는 코드를 실행하는 것입니다.
시간이 끝나면 스레드를 종료 한 다음 결과를 나타내는 스레드 코드를 갖습니다.
이와 비슷한 것입니다. 당신이 실제로 매우 짧은 수면을 어떻게

SqrtThread sqrtThread = new SqrtThread(2); //Will start automatically 
start high resolution timer 
while (time has not elapsed) { 
    sleep for very short period; 
} 
sqrtThread.interrupt(); //stop the thread. 

이 과제의 일부 당신이 알아 내가 그 떠날거야 그래서입니다 :

import java.io.*; 
public class SqrtThread extends Thread{ 
    private vars..... 
    public SqrtThread (double input) { 
    super('sqrtThread'); 
    this.input = input; 
    .... 
    this.start(); 
    } 

    public void run() { 
    while !(Thread.interrupted) { 
     //Do numberChruching 
    } 
    //output result 
    }   
} 

은 그럼 당신은 같은 의사 코드를 사용하여 스레드를 시작합니다.

0

테스트에 소요되는 시간은 각 방법에 대해 동일합니다. 따라서 비교에 관심이 있다면 이는 단점이 아닙니다. 또한, 테스트에 소요 된 시간이 중요하지 않은 것으로 의심됩니다.

기타 : 어쨌든 그러한 테스트가 필요합니다. 대개 주어진 오류에 대한 결과에 관심이 있습니다. 알려진 시간에 알 수없는 정확도를 얻지 못하기 때문에 필요한 시간이 다른 많은 것들 (CPU, JVM 등)에 달려 있기 때문입니다. 이것으로부터 두 번째 접근법에 대한 투표입니다.

0

그런 다음 프로세스를 중단 일정 시간을, 그리고 만약 당신이 대답 할 수있는 흥미로운 질문이 있습니다

  • 당신이 질문에 대답하기에 충분한 데이터를 수집 했는가를?

나는 그 질문에 대해 깊이 생각하게 할 것이지만, 여전히 계산 응답을 방해 할 수있는 방법을 제안합니다.

먼저 답이 맞는지 "알기"위해 제곱근의 처음 50 자리를 미리 알아야합니다. 정확성은 소요 시간과는 무관해야하므로 계산을 한 번 확인한 다음 정답을 하드 코드해야합니다.

두 번째로, 제곱근 계산 알고리즘을 실행할 수있는 패키지로 패키징해야합니다. 나는 서명

public void run() { 
    // your code goes here 
} 

과 방법을 강제로 자바 인터페이스 Runnable는, 그럼 당신은 자바 Thread과 잘 조화 무언가있을 것이라는 점을 건의 할 것입니다 그리고 당신은 자바 스레드를 중단 할 수 있습니다. 스레드의 결과가 중단되면 정상적인 상황에서 스레드 내에서 계산을 신뢰 할 수 없습니다.

간단한 수단 (그리고 프로젝트가 있지만, 안티 가설을 반증하는 시도에 대한 최신 자바 기술을 활용에 대한 아니기 때문에) 나중에 당신이 뭔가를 찾을 수 복용하면

Thread solution1 = new Thread(new Runnable1()); 
solution1.start(); 

그런 짓을하는 것입니다 너무

Thread.sleep(10000); // sleeps the current thread 10 seconds 
solution1.interrupt(); 

주 긴이 스레드를 중지하는 아주 우아하지 못한 방법이며, 당신이 Runnable1 나중에 작업 된 것을 믿을 수 없다.

다른,보다 정교한 기술과 같은 사용할 수 있습니다

public class Runnable1 implements Runnable { 

    private boolean running; 

    public Runnable1() { 
    running = false; 
    } 

    public void run() { 
    running = true; 
    while (running) { 
     // do one step of your computation 
    } 
    } 

    public void shutdown() { 
    running = false; 
    } 
} 

위의 예 정말 자바 코드의 품질을 향상 할 기능의 톤이있다; 그러나 코드의 품질은 당신의 요점을 증명하는 것과는 독립적이라는 것을 명심하십시오. 코드를 멋지게 연마하여 실제로 문제를 해결하는 것을 잊어 버리는 것이 가능합니다.

은 위의 코드는,이 기술은 당신의 (다음 루프 반복 전에) 알려진 상태에서 실행 가능한, 그래서 아마 그런 다음 기술 일부 중간 데이터를 캡처 할 수 종료

Runnable1 runnable1 = new Runnable1(); 
Thread thread1 = new Thread(runnable1); 
thread1.start 

// some means of waiting 
Thread.sleep(10000); // sleeps 10 seconds 
runnable1.shutdown(); 

를 호출 할 것이다 Runnable의 나머지 부분에는 중간 솔루션을보고하는 방법이 있습니다.

+0

시작하려면,'Thread' 클래스를 확장하는 것을 피하십시오. Java의 더 나은 동시성 기능 중, 어쨌든 코드를 "unwrite"해야합니다. –

관련 문제